导语
该文仅是笔者对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