现在在读Marcus S. Zarra的Core Data。自己也写了一些code来尝试core data。所以在这里总结一下。不对的地方请指正:)
基础
Core Data 对几个部分:NSManagedObjectModel, NSPersistentStoreCoordinator, NSPersistentStore, NSManagedObjectContext, NSManagedObject
NSManagedObjectModel
NSManagedObjectModel 就是你在xcode里面创建的.xcdatamodel 编译过后得到的.mom 的binary file。 它是我们创建的data model。
加载NSManagedObjectModel就是用这个.mom file 来 init 一个NSManagedObjectModel:
顺便安利一下ZAssert,详见MY CURRENT PREFIX.PCH FILE by Marcus Zarra
NSPersistentStoreCoordinator
NSPersistentStoreCoordinator 是Core Data的核心,负责loading, caching data 还有持久化。而NSPersistentStore 就是持久化的目的地,比如本地的SQlite Database。因为加载NSPersistentStore的时间可能很长(比如从iCould),所以应当异步执行。
NSManagedObjectContext
上面几个在init 之后基本都不会再碰了,而NSManagedObjectContext将会被用来保存和读取数据。
NSManagedObjectContext 只需要NSPersistentStore 就可以init 了,为了确保程序其他地方可以及时调用到NSManagedContext,NSManagedContext应该在NSPersistentStore init 之后init
同时由于NSManagedContext 不是线程安全的,这里用NSMainQueueConcurrencyType,之后对于NSManagedContext 的调用都应该在主线程里。
Fetching & Inserting
Fetch
Fetch 的时候要用NSFetchRequest,会得到一条NSManagedObject 的array
为fetchRequest 加上filter 和 sorter (否则取回来的东西顺序是随机的)
NSManagedObject 拿到之后就可以用KVC的方法来set/get 里面的值(包括relationship, one-to-many的会得到一个装了相应mangedObject的NSSet)
Insert
Insert 则是如下创建一个NSManagedObject 然后set 相应的值就好了
Save
最后Save 所有的changes, 就将数据持久化了
更简单的用法
subclass NSMangedObject
用KVC来设置NSManagedObject 显然需要一大段code。而更简单的方法就是直接subclass NSManagedObject, 例如
别忘了要设成dynamic, 因为这些properity 都是在运行时create 的
然后就可以像直接取用了
超方便是不是👍
stored fetch request
而fetch request 也是可以存起来的,如下图添加一个fetch request,可以设置fetch的条件
用的时候..