前言
CoreDataBooks是官方提供给开发者使用CoreData的demo写的非常好,最近正在学习,正好想用Swift重写,这样既学习了Swfit又学习了CoreData,何乐而不为。
一、CoreData入门
CoreData,虽然名字里面有“data”这个单词但是它却是个 framework,用于管理程序中的 model层对象,主要用于数据的持久化。我们甚至不必知道什么是sqlite,就可以通过CoreData使用sqlite。官方说了使用了CoreData在操作model层时我们大概可以减少50%到70%的代码!但遗憾的是在使用前有几个不好理解的概念需要深入的理解,下面我们就一一的攻克它们。
(1)、ManagedObjectModel
英文描述:
Much of Core Data’s functionality depends on the schema you create to describe your application’s entities, their properties, and the relationships between them. Core Data uses a schema called a managed object model — an instance of NSManagedObjectModel. In general, the richer the model, the better Core Data is able to support your application. A managed object model allows Core Data to map from records in a persistent store to managed objects that you use in your application. The model is a collection of entity description objects (instances of NSEntityDescription). An entity description describes an entity (which you can think of as a table in a database) in terms of its name, the name of the class used to represent the entity in your application, and what properties (attributes and relationships) it has.
英文直译:
CoreData大部分的功能是通过拟创建的一种架构(schema)来实现的,这种架构创建出来是为了描述程序的实体(entity),实体的属性(properties),以及实体间的关系的。用ManagedObjectModel的实例来表示这种架构。ManagedObjectModel允许CoreData把记录从持久化缓存(persistent store)中映射到程序中的的ManagedObjectModel对象。ManagedObjectModel是一个实体描述类(instances of NSEntityDescription)的集合,实体描述类描述的是一个实体(entity),一个实体相当于数据库中的一个表(table),实体是ManagedObject的子类。
作者理解:
被管理的数据模型,代表CoreData中的模型文件,用来描述实体、实体的属性、实体间的关系的模型图。Xcode中可以可视化的创建很方便。
(2)、NSManagedObjectContext
以防我的翻译水平有限造成误解还是先贴出英文原句:
An instance of NSManagedObjectContext represents a single “object space” or scratch pad in an application. Its primary responsibility is to manage a collection of managed objects. These objects form a group of related model objects that represent an internally consistent view of one or more persistent stores. A single managed object instance exists in one and only one context, but multiple copies of an object can exist in different contexts. Thus object uniquing is scoped to a particular context.
英文直译:
一个NSManagedObjectContext实例代表了应用程序中的一个”对象空间“或者一个“便笺”,主要职责是管理由管理者对象组成的一个集合,这些管理者对象形成一组相关的模型对象,这些模型对象对应着一个或者多个持久存储区域里的视图,一个单一的托管对象(下面会讲到)可以在一个上下文中存在,但是也可以在多个上下文中存在。
作者理解:
NSManagedObjectContext就是一个“便笺”干脆是个“word”文档,把临时的数据拷贝到这个便笺上,然后就可以随意的“增”,“添”,“改”这些临时数据了,折腾完了还可以调用undo/redo功能。像不像我们打开一个word文档,然后写一些东西,发现好像写错了就点击一下”撤销“按钮返回到上一个状态,不小心多点了一下“撤销”按钮,没事我们还有个“重做”按钮。当一切ok了点击一下“保存”按钮,也就是进行了持久话存储,把临时数据进行了持久化。这样来看,上下文是存储在RAM中的,持久化数据是存储在磁盘中的。我们知道数据库是存储在磁盘中的,
(3)、NSPersistentStoreCoordinator
英文描述:
The NSPersistentStoreCoordinator sits in the middle of the Core Data stack. The coordinator is responsible for realizing instances of entities that are defined inside of the model. It creates new instances of the entities in the model, and it retrieves existing instances from a persistent store (NSPersistentStore). The persistent store can be on disk or in memory. Depending on the structure of the application, it is possible, although uncommon, to have more than one persistent store being coordinated by the NSPersistentStoreCoordinator. Whereas the NSManagedObjectModel defines the structure of the data, the NSPersistentStoreCoordinator realizes objects from the data in the persistent store and passes those objects off to the requesting NSManagedObjectContext. The NSPersistentStoreCoordinator also verifies that the data is in a consistent state that matches the definitions in the NSManagedObjectModel.
英文直译:
NSPersistentStoreCoordinator(持久化协调器)位于核心数据栈(Core Data stack)的中间层,协调器负责实现定义在ManagedObjectModel中的那些实体(entities),协调器创建新的实体,并且可以从持久化存储层(NSPersistentStore)获取已经存在的实体。NSPersistentStore根据app的结构可能存在于内存(memory)中也了能存在磁盘上(disk)。虽然很少见但是也存在一个NSPersistentStoreCoordinator协调着多个NSPersistentStore的现象。 然而NSManagedObjectModel确定了结构中的数据,NSPersistentStoreCoordinator实现了按照requesting条件把对象从NSPersistentStore中取出放到NSManagedObjectContext中。
作者理解:
说NSPersistentStoreCoordinator(持久化协调器)中心前还是先说说CoreDataStack(CoreData把很多组件绑定在一起,称为一个堆栈)吧,这个堆栈主要分为两个部分,这一部分是关于对象图管理,在这一层就是app中模型层逻辑(NSManagedObject)存在的地方,NSManagedObject存在一个context里面,CoreData里面可以有一个或者多个context相互独立的存在。另外一部分是持久化的地方,在这儿,CoreData从文件系统中读写操作,这儿有持久化存储器(persistent store),持久化存储器在文件系统中与sqlite进行交互,可以有多个持久化存储器,但是他们必须都属于同一个NSPersistentStoreCoordinator。 好吧,NSPersistentStoreCoordinator也就是这两部分的中间层,通过NSPersistentStoreCoordinator把对象图层管理部分和持久化部分绑定在一起,起到两部分交互的作用。
说了这么多,CoreData也基本可以入门了。持续更新中