(转)Core Data1

Core Data是什么?
大概八年前,2005的四月份,Apple发布了OSX10.4,正是在这个版本中Core Data框架发布了。那个时候YouTube也刚发布。

Core Data是一个模型层的技术。Core Data帮助你建立代表程序状态的模型层。Core Data也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data不仅是一个加载、保存数据的框架,它还能和内存中的数据很好的共事。

如果你之前曾经接触过Object-relationalmaping(O/RM):Core Data不仅是一种O/RM。如果你之前曾经接触过SQL wrappers:Core Data不是一个SQL wrapper。它默认使用SQL,但是,它是一种更高级的抽象概念。如果你需要的是一个O/RM或者SQL wrapper,那么Core Data并不适合你。

对象图形管理是CoreData提供的最强大的功能之一。为了更好利用Core Data,这是你需要理解的一块内容。

还有一点要注意:CoreData是完全独立于任何UI层级的框架。它是作为模型层框架被设计出来的。在OS X中,甚至在一些后台驻留程序中,Core Data都起着非常重要的意义。

堆栈
Core Data有相当多可用的组件。这是一个非常灵活的技术。在大多数的使用情况下,设置都是相当简单。

当所有的组件都捆绑到一起的时候,我们把它称作Core Data堆栈,这个堆栈有两个主要部分。一部分是关于对象图形管理,这正是你需要很好掌握的那一部分,并且知道怎么使用。第二部分是关于持久化,比如,保存你模型对象的状态,然后再恢复模型对象的状态。

在两个部分之间,即堆栈中间,是持久化存储协调器(PSC)。它将对象图形管理部分和持久化部分捆绑在一起,当它们两者中的任何一部分需要和另一部分交流时,这便需要PSC来调节了。
(转)Core <wbr>Data1

对象图形管理是你程序模型层的逻辑存在的地方。模型层的对象存在于一个context内。在大多数的设置中,存在一个context,并且所有的对象存在于那个context中。Core Data支持许多contexts,但是,对于更多高级的使用情况,每个context和其他context区分的都很清楚。需要记住的是,对象和他们的context是相关联的,每个被管理的对象都知道自己属于哪个context,并且每个context都知道自己管理着哪个对象。

堆栈的另一部分就是持久化发生的地方了,即是Core Data从文件系统读或写的地方。持久化存存储协调器(persistent store coordinator)都有一个属于自己的持久化存储,并且这个store在文件系统中与SQLite数据库交互。为了支持更高级的设置,Core Data可以将多个存储附属于同一个持久化存储协调器,并且除了SQL可选择的类型外,还有很多存储类型可供选择。

最常见的解决方案,如下图所示:

(转)Core <wbr>Data1


组件如何一起工作
让我们快速的看一个说明组件如何协同工作的例子。在我们a full application using Core Data的文章中,我们正好有一个实体,即一种对象:我们有一个Item 实体对应一个title。每一个item可以拥有子items,因此,我们有一个父子关系。

这是我们的数据模型,正如我们在Data Models and Model Objects文章中提到的一样,在CoreData中一种特别的对象——实体。在这种情况下,我们只有一个实体:Item实体。同样的,我们有一个NSManagedObject的子类,叫做Item。这个Item实体映射到Item类上。在datamodels article中会详细的谈到这个。

我们的程序仅有一个根Item。这并没有什么奇妙的地方。这是一个我们用来显示底层item等级的Item。这是一个我们永远不会为其设置父类的Item。

当程序运行时,我们像上面图片描绘的一样设置我们的堆栈,一个存储,一个managed object context,一个持久化存储协调器来将他们两个关联。

在第一次运行时,我们并没有任何items。我们需要做的第一件事就是创建根item。你通过将他们插入context来增加管理对象。

创建对象

插入对象的方法似乎很笨重,我们通过NSEntityDescription的方法来插入:

1
2
+ ( id )insertNewObjectForEntityForName:( NSString *)entityName  
                inManagedObjectContext:( NSManagedObjectContext *)context


我们建议你增加两个方便的方法到你的模型类中:

1
2
3
4
5
6
7
8
9
10
+ ( NSString *)entityName
{
    return @“Item”;
}
  
+ (instancetype)insertNewObjectInManagedObjectContext:( NSManagedObjectContext *)moc;
{
    return [ NSEntityDescription insertNewObjectForEntityForName:[ self entityName]  
                                         inManagedObjectContext:moc];
}



现在,我们可以像这样插入我们的根对象了:


1
Item *rootItem = [IteminsertNewObjectInManagedObjectContext:managedObjectContext];



现在,在我们的managedobject context(MOC)中有一个唯一的item。Context知道这是一个新插入进来需要被管理的对象,并且被管理的对象rootItem知道这个Context(它有一个-managedObjectContext方法)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值