Swift下CoreData的使用

我之前的随笔中有写过一些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 就很不错哦。

 

 

     

 

 

 

      

posted @ 2017-09-16 16:24  BennyLoo  阅读(926)  评论(0编辑  收藏  举报