Entity属性的各种设置选项
Transient
如果在Properties
中勾选了这一项,那么该属性就不会写入持久化存储区了。“不写入持久化存储区”听上去有些奇怪,但是有时,只需要吧特性留在托管对象上下文里面就行了。比方说,你需要计算某个临时的值,而这种值就可以放在transient
特性中。
Optional
Optional
特性并不一定要有值。所有的特性在刚建出来的时候都是Optional
特性。如果某一个不是Optional
特性,那么在把这非Optional
特性放回存储区的时候,它必须具备有效的值才行。
Indexed
系统会优化Indexed
特性以提升搜索效率,但代价是要在底层的持久化存储区占用额外的空间。这些额外的空间的大小要根据待索引的数据量来定。如果不打算搜索某个属性,那么就不要勾选Indexed
,这样可以节省一些空间。
Validation
你可以使用Validation
中的各个选项来阻止不合理的数据进入持久化存储区。每一种数值型的属性都支持相同的Validation
选项,也就是可以规定其最小值和最大值。同理,对于字符串类型或者日期类型的属性来说,可以限定其字符串长度和日期范围。
Default Value
除了可变数据类型与二进制数据之外,其余类型的属性都可以具备默认值。
Reg. Ex.
Reg. Ex.
是Regular Expression
(正则表达式)的缩写,他不仅能够限定字符串的最小长度以及最大长度,而且还能实现很多验证功能。一般来说,我们会用正则表达式来判断属性中的字符串值是不是能与某个特定的模式相匹配。匹配成功了才能将其写入持久化存储区。
Store in External Record File
开启了这个选项之后,类型为二进制数据的属性就可以把大量数据保存在持久化存储区之外了。但如果底层的持久化存储区是XML格式(iOS不支持这种格式的存储区),那么该选项就不起作用了。
后端SQL的可见性
按照下列步骤开启SQL Debug模式
1、点击Product>Scheme>Edit Scheme ...
2、点击Run,并切换到Arguments分页。
3、点击Arguments Passed On Launch区域中的“+”按钮,以新增参数。
4、输入新参数 -com.apple.CoreData.SQLDebug 3,然后点击OK。
现在我们已经开启了第三级的SQL Debug模式,然后重新运行程序,查看控制台输出了什么。
设置并获取请求模版
如果我们每一次获取托管对象时都要使用手工编写谓词格式确实很累人哇。幸好的是,Xcode的Data Model Designer有预定义获取请求的功能。这些可复用的模版比谓词更容易配置,而且还能减少重复代码。
创建获取请求模版:
- 选中.xcdatamodeld。
- 点击Editot > Add Fetch Rquest。
- 然后设置请求模版的名称。
- 点击+按钮来配置获取请求模版。
要想使用获取请求模版,需要先给托管对象模型发送消息,告诉他将要使用的模版叫做什么名字。发送完消息之后,就可以在返回的NSFetchRequest上面操作了。由于这种获取请求是根据模版创建出来的,所以我们无需通过向其发送谓词来执行筛选操作。
代码举例: 找到Fetch Rquest 模板中的request并使用。
- (void)searchStudentFromFetchRequestTemplate{
NSManagedObjectModel *mom = [CoreDataHelper getManagedObjectModel];
NSFetchRequest *req1 = [mom fetchRequestTemplateForName:@"Name"];
NSError *error = nil;
NSArray *students = [self.context executeFetchRequest:req1 error:&error];
if (error) {
[NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
}else{
Student *stu = [students lastObject];
self.hintLabel.text = [NSString stringWithFormat:@"找到了最后一个学生,名字是%@,id是%zd",stu.name,stu.idNum];
}
}
托管对象模型之间的关系
关系是用来链接实体的。在托管对象模型中使用关系。
我们把界面的Editor Style 改为 Graph,按下control键,用鼠标从一个实体托向另一个实体。当编辑器界面处于Graph风格时,在两实体之间创建的关系是双向关系。
如果在Table风格的编辑器界面中创建关系,那么创建出来的可能就是单向关系,此时如果需要建立双向关系,那么还必须手动添加反向的那一条关系。
把两个实体关联起来之后,我们就可以通过关系来访问相关实体的属性了。
接下来的问题就是,要想清楚每个方向上的关系是一对多,还是一对一。想清楚这个问题之后,你应该就能给关系起一个更为合适的名字。一对多的关系,不限制目标对象的数量,而一对一的关系则会把目标对象的数量限定为一个。
实体的继承
与类一样,实体也可以继承自父实体。这个功能有助于简化数据模型。子实体会自动继承父实体的各种属性。<u>在底层的SQLite存储区里,父-子体系中的实体都会存储到同一张数据表里</u>。
<u>如果不想令父实体实例化,那么可以将其标注为抽象的。</u>只有能够确定父实体在代码中毫无意义时,才应该启用这个选项。