coredata 初窥
首先 在创建ios 项目的时候。勾选上coredata。这样xcode 就会帮你生成一部分的coredata代码。
如上图所示 勾选上最下方的coredata 即可。让我们来看看。这样xcode为我们做了什么。首先:工程文件下面多了个后缀名为 .xcdatamodeld的文件。这是coredata的模型文件。然后看看appdelegate里面生成了一些代码:
首先增加了三个属性:
managedObjectContext
managedObjectModel
persistentStoreCoordinator
用上面的这张图 可以更加清晰的了解他们之间的关心。他们之间的关系就像一个栈。看第二张图可以看出 引用程序在栈的最顶层。他跟 Managed Object Context 交互。而 context对象 又去调用 Persistent Store Coordinator 。这里实现了底层对数据的完整处理。将原始数据跟 model进行转换。而转换规则就是依赖与managed object model 的描述。
让我们来一个个解读这三个属性:
Managed Object Model :
Managed Object Model 的作用就是定义实体(entities)的描述。在大部分的代码里面这些描述是根据上面的xcdatamodeld文件生成的(当然不是必须要用文件来生成。只是大家都这样用。这样理解更直观)
Persistent Store Coordinator :
Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。依赖于上面的Managed Object Model 对象。也依赖于底层实现。其实就是一个底层实现跟 .Managed Object Model 对象之间关系的具体实现。对于底层的是通过调用Persistent Stores来实现的。每个 persistent object store 对应一个存储文件
对于persistent store coordinator 是可以设置多个的。还可以设置只读等属性。不过正常开发貌似很难用的。就不去太深入了解了。
persistent store coordinator 的存储 实现。苹果定义了 4个:
COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0);
COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA);
COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0);
COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);
正常情况下 我们使用的都是sqllite
Managed Object Context :
Managed Object Context 参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。他是具体去操作上面的 Persistent Store Coordinator 来实现对coredata数据的访问以及修改。 是最顶层的实现。一般情况。我们和它交互即可。
context 对象对所有的Managed Object(可以理解为就是数据库一行数据) 进行管理。而每个Managed Object 也必然被某一个context所管理。而context也会缓存使用过(查询出来过 或者自己插入的等等)如果下次需要使用。不会去 Persistent Store Coordinator 去重新做底层查询。另外coredata 也是懒加载的。当你查询出来的对象只有真正使用的时候才会映射成真正的值。在映射之前就是一个类似指针的值。
managedObjectModel
这里我们主要还是了解创建.xcdatamodeld以及上面的属性
创建好一个.xcdatamodeld文件后我们可以看到一个这样的界面
而左边是我点击edit 弹出的下拉菜单。可以看出针对整个model。我们可以添加 entity (可以想象成一个表)fetch request(可以想象成为一个查询语句)以及 configuration(配置)
创建一个entity之后 又会有添加属性 关系 以及 fetched property等。我们来一个个了解:
属性:
属性可以简单理解为一个表的一个字段。
可以看到他有这些内容。
transient 是表示这个字段并不是真正存入数据库的。简单的说是就是缓存的一个字段。比如有个性别是0,1 int类型。需要显示男女。就可以添加这个字段。通过真正的属性得出。不过这里有个盲区需要特别注意这个字段也会被缓存的。当被依赖的字段改变 并不会改变这个值。 容易导致数据不一致性。
optional 是否可选。整个没啥好说的。 注意一点 能使用必填的尽量用必填。特备是数字。因为 为空的时候是NULL 对象 非常特殊的一个对象。
indexed 索引 也比较简单。类型也不说了。
关系 :
可以理解为 外键关系 一对一 一对多 多对多 在coredata里面多对多是通过 2个一对多来实现的。
Fetched property 一个弱关系。可以理解为是一个查询的结果集。
Fetch request 缓存的请求。