《Core Data应用开发实践指南》一2.7 属性的各种设置选项

2.7 属性的各种设置选项

图2-5右侧是Data Model Inspector,开发者可以在这个界面中配置类型之外的其他属性选项。选中某个属性之后,按“Option++3”组合键,即可显示该界面。可供配置的选项根据属性的类型而有所变化。并不是每一种属性都能配置下列选项:
Transient 如果在Properties中勾选了这一项,那么该特性就不会写入持久化存储区了。“不写入持久化存储区的特性”听上去有些奇怪,但有的时候,只需把特性留在托管对象上下文里面就行了。比方说,你需要计算某个临时的值,而这种值就可以放在transient特性中,此特性会留在上下文里,从而能够得益于撤销或重做等功能。
Optional optional特性并不一定要有值。所有的特性在刚创建出来的时候都是optional特性。如果某特性不是optional特性,那么在把这个非optional特性放回存储区的时候,它必须具备有效的值才行。
Indexed 系统会优化Indexed特性以提升搜索效率,但代价是要在底层的持久化存储区中占用额外的空间。这些额外空间的大小要根据待索引的数据量来定。如果不打算搜索某个属性,那么就不要勾选Indexed,这样可以节省一些空间。
Validation 你可以使用Validation中的各个选项来阻止不合理的数据进入持久化存储区。每一种数值型的属性类型都支持相同的validation(验证)选项,也就是可以规定其最小值与最大值。同理,对于字符串类型或日期类型的属性来说,也可以限定其字符串长度或日期范围。无效的值其实也可以出现在托管对象上下文里面,只要在调用save:之前能把这个问题解决就行。一般来说,应该在用户试图将焦点从输入控件(比如UITextField)中移开的时候验证数据。
Reg. Ex. Reg. Ex.是Regular Expression(正则表达式)的缩写,它不仅能够限定字符串的最小长度及最大长度,而且还能实现很多验证功能。当然可以用它来限定字符串的长度,但一般来说,我们会用正则表达式来判断属性中的字符串值是不是能与某个特定的模式(pattern)相匹配。如果为某个属性配置了Reg. Ex.验证功能,那么托管对象中与之对应的特性值就必须要能和给定的模式相匹配才行,否则无法将其写入持久化存储区。开发者所配置的待匹配模式必须符合ICU Reg Ex规范。该规范的详情以及可供使用的配置选项请参考:http://userguide.icu-project.org/strings/regexp
Default 除了可变数据类型与二进制数据之外,其余类型的属性都可以具备默认值。如果开发者不给属性指定具体的值,那么它们的初始值就是默认值。考虑到后端SQLite数据库处理null值的方式,笔者觉得应该给数值型的属性设定默认值。对于字符串类型的属性来说,默认值要依照具体情况来定,也就是说,得根据自己的需求来为这种属性选择适当的默认值。而对于日期类型的属性来说,开发者则无法在Model Editor中把它的默认值设为“now”(当前时间)。
Allows External Storage 开启了该选项之后,类型为二进制数据的属性就可以把大量数据保存在持久化存储区之外了。假如要保存照片、音频、视频等数据量非常大的媒体文件,那么笔者推荐你启用该选项。启用之后,Core Data会自动把数据量超过1MB的属性值保存在SQLite持久化存储区之外。但如果底层的持久化存储区是XML格式(注意,iOS不支持这种格式的存储区),那么该选项不起作用。
Index in Spotlight 这个选项不会影响iOS应用程序,它的用途是把基于Core Data的Mac应用程序同Spotlight集成起来。Spotlight是一种搜索机制。在Mac操作系统中,屏幕右上角会有个“放大镜”图标,用户点击该图标之后,即可利用该机制来搜索。Mac应用程序的某个Core Data 属性如果启用了Index in Spotlight选项,那么它的值就会出现在Spotlight的搜索结果中。Core Data会创建一种长度为0的隐藏文件,用以表示持久化存储区中的记录,而Spotlight在执行搜索的时候,则会寻找这种文件。如果持久化存储区里某个属性的值变了,而这个属性又启用了Index in Spotlight选项,那么存储区外对应的那个文件也会随之自动更新。
Store in External Record File 启用了该选项之后,系统会把持久化存储区里的数据复制成XML格式,并保存在存储区之外。该选项如果和Index in Spotlight选项一起启用,那么在创建供Spotlight所用的“索引文件”(index file)时,文件里面就会填有一些值。除非有特殊需要(比如为了调试),否则笔者不建议开启此选项。假如想通过“external records”(外部记录)给其他应用程序提供数据,那么请注意:包含records的目录其结构可能会改变。
Name 如果某个属性的类型是可变类型,那么名称这一栏中填写的名称将会用作NSValueTransformer子类的名称,而这个子类会知道如何在任意的类与NSData之间相互转换。
请按下列步骤修改Grocery Dude,为相关的属性启用Indexed选项并配置其默认值:

  1. 勾选name 属性的Indexed选项。
  2. 将name 属性的Default Value(默认值)设为New Item。
  3. 将quantity 属性的Default Value设为1。
  4. 将listed 属性的Default Value设为YES。这样一来,新创建的item就会出现在购物清单中了。
  5. 将collected 属性的Default Value设为NO,这么做是为了使购物清单中的新item不会处于“打上对勾”(ticked off)的状态。
时间: 2024-09-19 09:06:36

《Core Data应用开发实践指南》一2.7 属性的各种设置选项的相关文章

《Core Data应用开发实践指南》一1.4 为现有的应用程序添加Core Data支持

1.4 为现有的应用程序添加Core Data支持 在Xcode中创建iOS应用程序项目时,可以使用各种起始模板(starting-point template).假如要根据Master-Detail.Utility Application或Empty Application等模板来创建项目,那么只需勾选Use Core Data,即可在项目中使用Core Data.不过,Grocery Dude项目是根据Single View Application模板创建的,它起初并没有包含Core Dat

《Core Data应用开发实践指南》一3.5 通过迁移管理器来迁移数据

3.5 通过迁移管理器来迁移数据 除了通过NSPersistentStoreCoordinator来迁移存储区之外,还可以采用迁移管理器来做.迁移管理器可以使开发者全权掌控迁移过程中创建的文件,从而令他们能够按自己的方式来灵活处理迁移中的各种问题.使用迁移管理器的一个好处就是可以向用户报告迁移进度,使用户知道应用程序哪次会启动得比较慢一些,所以需要耐心等待.虽说迁移过程理应执行得非常快才对,但当数据库比较大.变动比较复杂时,迁移过程就需要耗费一定的时间了.为了使用户界面保持流畅,迁移过程必须在后

《Core Data应用开发实践指南》一1.2 Core Data的适用场合

1.2 Core Data的适用场合 如果应用程序要保存的设置数据太多,以致NSUserDefaults及"特性列表"(property list)这种简单的存储方案无法应付,那么就会出现内存占用量方面的问题.解决办法是直接使用数据库或通过Core Data来间接操作数据库.选用Core Data的好处是,不用再花时间编写数据库接口的代码了.此外,你还将享受性能方面的优势,而且可以使用诸如撤销及验证等强大的功能.假如选择直接使用数据库,那就要花时间去做开发与测试工作,也就是通常所说的&

《Core Data应用开发实践指南》一3.1 修改托管对象模型

3.1 修改托管对象模型 在应用程序的进化过程中,其托管对象模型也可能需要改变.对于一些比较简单的修改,诸如设定属性的默认值.设定验证规则.使用获取请求模板等,是可以直接实施的.而对于另外一些更为结构化的(structural)修改,则需先把持久化存储区迁移到新的模型版本才行.假如没有提供迁移数据所需的映射与设定,那么应用程序就会崩溃.为了继续构建范例程序,需要把上一章中的代码添加到Grocery Dude项目中.或者可以去http://www.timroadley.com/LearningCo

《Core Data应用开发实践指南》一2.2 添加托管对象模型

2.2 添加托管对象模型 在第1章中,我们通过CoreDataHelper.m文件里的mergedModelFromBundles方法初始化了托管对象模型.然而现在的问题是:项目里根本就没有模型可用!如果连模型都没有的话,那Core Data就彻底失去意义了,所以,我们这个时候应该创建模型文件.模型文件一般会含有"对象图",而对象图则用来表示应用程序的数据结构以及其他一些可以简化应用程序开发的东西,我们稍后再来解释.请按下列步骤修改Grocery Dude,以便添加数据模型文件: 在现

《Core Data应用开发实践指南》一第1章 初次尝试Core Data应用程序

第1章 初次尝试Core Data应用程序 如果不能把一件事用简单的话说清楚,那就表明你理解得还不够透彻.-阿尔伯特•爱因斯坦"体验式学习"(kinesthetic learning)或者说"从实践中学习"(learning by doing),是接收并记住信息的绝佳手段.即便对于许多有经验的程序员来说,Core Data也是个相当棘手的话题,于是,笔者就适时地编写了你手中的这本书,它以实践的方式来讲解Core Data.本书不会过早地讲解一些比较难懂的话题,本章只

《Core Data应用开发实践指南》一1.3 创建Grocery Dude项目

1.3 创建Grocery Dude项目 Grocery Dude是个运行在iPhone上的范例程序,在学习本书的过程中,你将了解到它的制作流程.学会了Core Data中的某个特性或某项开发技巧之后,你可以将其运用在Grocery Dude程序上面.到了本书收尾的时候,你将会制作好一款功能完备而且运行速度很快的Code Data程序,它能够同iCloud紧密地集成在一起.假如你现在就想直接看看成品,那可以去App Store下载Grocery Dude.请注意,Grocery Dude是专门为

《Core Data应用开发实践指南》一3.3 轻量级的迁移方式

3.3 轻量级的迁移方式 把新模型设为当前版本之后,必须迁移现有的持久化存储区,只有这样,才能正常使用新模型.这是因为,持久化存储区协调器会试着用新版的模型来打开原有的存储区,但由于原有的存储区是用旧版模型创建的,所以该操作会失败.在向NSPersis-tentStoreCoordinator添加存储区的时候,只需将下列选项放在NSDictionary里传过去,即可自动完成存储区的迁移工作:如果传给NSPersistentStoreCoordinator的NSMigratePersistentS

《Core Data应用开发实践指南》一2.12 后端SQL的可见性

2.12 后端SQL的可见性 如果只在控制台的日志中查看Core Data所输出的结果,那么意义并不算太大.你知不知道这些事情背后究竟发生了什么?Core Data对持久化存储区中的数据到底进行了哪些操作?这些操作是否恰当?为了提供无缝的Core Data体验,系统都生成了哪些SQL查询语句?每次在模拟器中运行程序的时候,是不是会插入重复的对象? 有个极其详尽的调试选项可以提供足够的信息,告诉你这些操作背后所发生的事情,从而令你知道上述那些问题的答案.这个调试选项会把系统自动生成的SQL查询语句