我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite、解归档、沙盒存放等等。这些方式中,能够大规模存储,并保持性能的只有使用sqlite了。而这里将记录下Cocoa自身继承的数据库的存储方案--CoreData的使用。
CoreData在底层也是直接采用了sqlite等作为数据库的搭建。只是在上层封装成Cocoa熟悉的方式,这样,即使对于不熟悉其他的数据的开发者来说,也不会感到无从下手。 同时CoreData中加入了可视化地操作数据的关联操作,为我们在Cocoa中使用CoreData提供更方便的途径。
一、搭建CoreData环境。
搭建CoreData的环境有两种方式。第一种在项目中搭建,这种方式比较繁琐,需要开发者指定存储地址、方式等。除非是在已经开发的项目中添加CoreData,不然不推荐。 第二种方式是在项目创建的时候,勾选User Core Data功能,项目创建之后,会自动创建CoreData的相关代码。搭建成功之后,在Appdelegate文件中会看到一静创建后的代码。接下来在项目中,就可以使用CoreData了。
二、可视化建立项目中的实体
在项目中找到 项目名.xcdatamodeld 文件。这是可视化操作CoreData的窗口。(这个文件只有在添加了CoreData的时候才有,否则需要手动创建。)
在使用开始,这个文件是空的,我们需要添加实体,点击图中的窗口底部的 add entiy ,成功之后在左侧一栏看到已经添加的实体。
修改名字,这里注意,实体的名字必须是大些字母开头。
在右侧栏中我们看到每个实体有三个小标题: 分别是 属性(attribute)、关联(relationship)、Fetched propertries(查询对象)。
attribute
attribute类似于我们创建一个类的属性,其实就是NSMangerModel中的属性。 对一个NSMangerModel类中,所有需要存储的属性都可以放在这里。 添加方式是:点击下方的“+”就可以添加了。 attribute 能选择的类型包括以下:
- Undefined: 默认值,参与编译会报错
- Integer 16: 整数,表示范围
-32768 ~ 32767
- Integer 32: 整数,表示范围
-2147483648 ~ 2147483647
- Integer 64: 整数,表示范围
–9223372036854775808 ~ 9223372036854775807
- Float: 小数,通过
MAXFLOAT
宏定义来看,最大值用科学计数法表示是0x1.fffffep+127f
- Double: 小数,小数位比
Float
更精确,表示范围更大 - String: 字符串,用
NSString
表示 - Boolean: 布尔值,用
NSNumber
表示 - Date: 时间,用
NSDate
表示 - Binary Data: 二进制,用
NSData
表示 - Transformable:
OC
对象,用id
表示。可以在创建托管对象类文件后,手动改为对应的OC
类名。使用的前提是,这个OC
对象必须遵守并实现NSCoding
协议
relationship
relationship中描述的是实体与实体之间的关系。有 多对多、多对一、一对多、一对一四种情况可选。
Fetched propertries
Fetched Properties
用于定义查询操作,和NSFetchRequest
功能相同。定义fetchedProperty
对象后,可以通过NSManagedObjectModel
类的fetchRequestFromTemplateWithName:substitutionVariables:
方法或其他相关方法获取这个fetchedProperty
对象。 个人觉得这个属性类似saqlite中的 autoindex。可以作为实体标签,便于查找。
三、建立实体之间的关联
建立一个实体之后,其实就已经用来保存实体的实例化对象了。但是有不少情况我们的实体并没有很单纯,可能我们需要在实体中保存的不仅仅是属性,而是一个个实体。这时候就需要将这一个个实体和主实体关联起来。 在窗口底部有一排功能按钮,最右侧的按钮可以选择实体的展示方式。
我们将之切换到group样式。
按住Ctrl键拖动实体,可以将两个实体关联起来。
关联之后,将实体展示切换会 list 模式,在relationship中看到两个实体之间的关联,设置相对应地名字。同时在右侧栏中看到一些设置。调整关联中的一些属性,比如删除规则,关联类型,等等。
创建好实体和关联关系之后,我们就该创建这些实体的类了。选中 项目名.xcdatamodeld 文件,菜单中选择 EIdtor -> CreartNSmangerObject ,选择保存的位置即可
最后看到创建好的实体文件。我们将这些看着跟一般的类一样即可。 只不过,它包含了存储到CoreData 的API。
四、 如何保存Coredata不支持的属性
上面讲到了attribute只能选择部分类型。
如果是不支持的类型可以将之设置成 Transformable,然后在项目中创建Transformable的子类,实现Transformable类型对要转化的类型的转换。这种方式稍稍有点繁琐。
在这里提供一个小技巧。
在Entity+CoreDataClass文件中,我们可以自定义一些属性。 通过设置其get和set方法,实现存储和转化。具体操作如下:
假如我们需要保存一张图片大CoreData,显然直接保存是不可能的,我们可以在实体放置一个image属性,将其类型设置为 NSData。
再在创建的实体的文件处理如下:
五、 建议使用第三方的框架使用CoreData。
尽管苹果公司对coreData做了很大的优化,但是使用起来还是略显麻烦,同学们可以找一些比较好的第三方框架。比如我目前正在使用的MagicalRecord 就很不错哦。