導語
該文僅是筆者對CoreData的理解,文中書寫不當和錯誤的地方還請各位看官給予指正。
iOS數據存儲有四種方式
對象歸檔、Plist、SQLite和CoreData.該篇文章主要介紹CoreData的使用。
為什么使用CoreData?
1.代碼量少:可以不用編寫數據庫接口代碼;2.界面可視化;3.可以使用instruments相關模版測試;
基本構成
數據持久化-CoreData、SQLite、FMDB - 推酷
1)NSManagedObjectContext(被管理的數據上下文)
操作實際內容(操作持久層)
作用:插入數據,查詢數據,刪除數據
2)NSManagedObjectModel(被管理的數據模型)
數據庫所有表格或數據結構,包含各實體的定義信息
作用:添加實體的屬性,建立屬性之間的關系
操作方法:視圖編輯器,或代碼
3)NSPersistentStoreCoordinator(持久化存儲助理)
相當于數據庫的連接器
作用:設置數據存儲的名字,位置,存儲方式,和存儲時機
4)NSManagedObject(被管理的數據記錄)
相當于數據庫中的表格記錄
5)NSFetchRequest(獲取數據的請求)
相當于查詢語句
6)NSEntityDescription(實體結構)
相當于表格結構
7)后綴為.xcdatamodeld的包
里面是.xcdatamodel文件,用數據模型編輯器編輯
編譯后為.momd或.mom文件
數據查詢、添加、刪除
數據查詢可以通過NSFetchRequest來實現,有四種方式。假設CoreData中的實體為Venue,定義一個數組 var venues:[Venue]! = []
managedContext = appDelegate.managedObjectContext
//查詢數據
//? 1.
let batchUpdate = NSBatchUpdateRequest(entityName: "Venue")
batchUpdate.propertiesToUpdate = ["實體中的屬性" : 屬性類型,例如:NSNumber(bool: true)]
batchUpdate.affectedStores = managedContext.persistentStoreCoordinator!.persistentStores
batchUpdate.resultType = .UpdatedObjectsCountResultType
do {
let batchResult = try managedContext.executeRequest(batchUpdate) as! NSBatchUpdateResult
print("Records updated \(batchResult.result!)")
} catch let error as NSError {
print("Could not update \(error), \(error.userInfo)")
}
//? 2.
fetchRequest = NSFetchRequest(entityName: "Venue")
//? 3.? 這步的實現需要在.xcdatamodel文件中建立一個FetchRequest,如下圖所示
let model = managedContext.persistentStoreCoordinator?.managedObjectModel
fetchRequest = model?.fetchRequestTemplateForName("FetchRequest")
//? 4
asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest, completionBlock: {[unowned self] (result: NSAsynchronousFetchResult! )
-> Void in
self.venues = result.finalResult as! [Venue]
})
do{
//方法2和3都可通過這句話得到venues
// venues = try managedContext.executeFetchRequest(fetchRequest) as! [Venue]
//執行方法 4
try managedContext.executeRequest(asyncFetchRequest)
}catch let error as NSError {
print(error)
}
//添加數據
let venue = NSEntityDescription.insertNewObjectForEntityForName("Venue",inManagedObjectContext: managedObjectContext) as! Venue
venue.name = "zhangsan"
venue.age = 18
do {
try managedContext.save()
}catch let error as NSError {
print("could not save\(error),\(error.userInfo)")
}
//刪除數據
//let fetchRequest = NSFetchRequest(entityName: "Venue")
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
for data in results {
managedContext.deleteObject(data as! NSManagedObject)
do {
try managedContext.save()
}catch let error as NSError {
print("could not save\(error),\(error.userInfo)")
}
}
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
}
上圖實現的方式:長按Add entity