zoukankan      html  css  js  c++  java
  • 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 就很不错哦。

         

          

  • 相关阅读:
    [转帖]gesture recognition
    [转帖]了解AmbiLight知识
    [转帖]AVS音视频编解码技术了解
    [笔记]新概念英语听力
    ES 学习记录
    Spring Aop 错误之:No MethodInvocation found ... the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST
    AOP无法切入同类调用方法解决办法
    多数据源 Spring 1.x 和 spring 2.x区别
    Intellij IDEA 在一个窗口添加多个项目并全部加入version control
    PageHelper 分页和排序之间的关系
  • 原文地址:https://www.cnblogs.com/FBiOSBlog/p/7531670.html
Copyright © 2011-2022 走看看