什么是CoreData?

简介

Core Data是个框架(并不是数据库哦),它使开发者可以把数据当做对象来操作,而不必在乎数据在磁盘中的存储方式。对于iOS程序员来说,这很有用,因为我们已经可以通过代码非常熟悉的操作对象了。由Core Data 所提供的数据对象叫做托管对象(Managed Object),而Core Data本身则位于你的应用程序和持久化存储区(Persistent store)之间。为了把数据从托管对象映射到持久化存储区中,Core Data 需要使用托管对象模型。所有的托管对象都必须位于托管对象上下文(Managed object context)里面,而托管对象上下文又位于高速的易失性存储器里面,也就是位于RAM中。

为什么需要有托管对象上下文呢?原因之一就是在磁盘与RAM之间传输数据时会有开销。磁盘读写速度比RAM慢的多,所以不应该频繁地访问它。有了托管对象上下文,就可以非常迅速地获取到了。但它的缺点在于,开发者必须在托管对象上下文上面定期调用save方法,以将变更后的数据写回磁盘。托管对象上下文的另一个功能是记录开发者对托管对象所对的修改,以提供完整的撤销和重做支持。

上边我们对Core Data简单的介绍了一下。接下来我们需要对CoreData中的重要的名词做一解释。

持久化存储协调器

持久化存储协调器(persistent store coordinator)里面包含一份持久化存储区,而存储区里面又含有数据表里面的若干行数据。设置持久化存储协调器的时候,我们通常选用SQLite 数据库作为持久化存储区。另外,也可以选用Binary、XML、或In-Memory等形式的持久化存储区。但要注意的是,Binary和XML格式的 存储区是Atomic,也就是说,即便你只想修改少量的数据,在保存的时候也依然需要把整个文件都写入磁盘。

同一个持久化存储协调器可以有多个持久化存储区。把CoreDataiCloud相集成的时候,就可能会出现这样的情况。我们可以把不属于iCloud的数据放在一个存储区里面,而把属于iCloud的数据放在另外一个存储区里面,这样既能节省网络宽带,又能节省iCloud存储空间。

即便你有两个持久化存储区,也不意味着必须使用两种对象图。CoreData的模型配置允许开发者使用多个独立的存储区,但却采用同一套对象图。在设置CoreData的模型配置选项时,可以指明对象图里面的某一部分属于哪一个持久化存储区

要想创建持久化存储区,需生成NSPersistentStore;要想创建持久化存储协调器,需生成NSPersistentStoreCoordinator类的实例。

托管对象模型

托管对象模型它位于持久化存储协调器托管对象上下文直间。顾名思议,托管对象模型是描述数据结构的模型或者图示,而托管对象正是以它为基础产生出来的。可以用Xcode来配置实体(Entity)及实体之间的关系。实体本身并不包含数据,它们只是规定了基于该实体的托管对象具有何种特性。实体也有属性,属性的数据类型可以是整数,字符串,或者日期等。

要想创建托管对象模型,需要生成NSManagedObjectModel类的实例。

托管对象上下文

托管对象上下文中可包含多个托管对象。托管对象上下文负责管理其中对象的生命期,并且负责提供许多强大的功能。

托管对象上下文也可以不止有一个,有时我们需要在后台处理任务(比方说把数据保存到磁盘或者导入数据),这种情 况下可以采用多个上下文。加入在前台上下文上面调用Save,那么用户界面就可能会有卡顿现象,尤其当数据变化较大的时候更是如此。要想避免这个问题,有 个简单的办法就是只在用户按下手机的Home键时才去调用Save,这时应用程序会转入到后台。还有个稍微复杂的但却很灵活的办法,就是采取两个托管对象上下文。请记住,托管对象上下文是存放在高速内存里面的。你可以配置其中一个上下文,那么就可以将后台上下文种的数据异步存入磁盘。这种分段式的做法可以确保磁盘写入操作不会影响用户界面的流畅度。

要想创建托管对象上下文,需要生成NSManagedObjectContext类的实例

原文地址:https://www.cnblogs.com/luoxiaoxi/p/5075130.html