NSManagedObjectContext 是一个被管理数据的上下文,它实际上是对所有数据库操作的一个缓存层,把所有的操作都先缓存起来避免大量磁盘 IO 造成不流畅,在操作完数据库后调用其 save 方法,就可以把数据库操作提交给持久化层(NSPersistentStoreCoordinator),由持久化层一次性写入数据库文件。
NSManagedObject 是被管理的数据记录,对应数据库的一个表。
另外,Core Data 可以将多个 stores 附属于同一个持久化存储协调器,并且除了存储 SQL 格式外,还有很多存储类型可供选择。 最常见的方案如下
实际使用
下面是笔者定义的一个 Event 表的元素组成
定义数据模型
1 2 3 4 5 6 7 8 9
classMXWEventModel: NSObject { var id: Int64 var time: Date var title: String var detail: String var addr: String init(id: Int64, title: String, detail: String, addr: String, time: Date){} }
新增数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
let context = persistentContainer.viewContext
publicfuncadd(model: AnyObject) { let eventModel: MXWEventModel= model as!MXWEventModel let entity =NSEntityDescription.entity(forEntityName: @"MXWEvent", in: context!) let obj =NSManagedObject(entity: entity!, insertInto: context) obj.setValue(eventModel.id, forKey: "id") obj.setValue(eventModel.title, forKey: "title") obj.setValue(eventModel.detail, forKey: "detail") obj.setValue(eventModel.time, forKey: "time") obj.setValue(eventModel.addr, forKey: "addr") do { try context?.save() } catch { print(error) } }
删除数据
1 2 3 4 5 6 7 8 9 10
publicfuncdelete(id: Int64) { let request =NSFetchRequest<NSFetchRequestResult>(entityName: @"MXWEvent") request.predicate =NSPredicate(format: "id==\(id)") let deleteRequest =NSBatchDeleteRequest(fetchRequest: request) do { try context?.execute(deleteRequest) } catch { print(error) } }
Core Data 中没有自增数据类型。因为 Core Data 不能使用数据库思维去使用,所以也就很好解释了。
设置 context 的 merge 策略,减少数据迁移的麻烦。
最好使用多线程,可以进一步提升性能。
最后,文章开头给出了性能比较。但是,笔者认为,在客户端并没有很大量的数据写入,只要开发者在使用过程中稍作注意,性能应该不是否决 Core Data 技术方案的理由。反倒,Core Data 对 iCloud 很好的支持,以及数据迁移备份,这些都可以很容易实现。笔者认为,完全可以考虑使用它做客户端的数据持久化方案。