Core Data数据持久化存储
Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂。Core Data 相关的类比较多,初学者往往不太容易弄懂。
一.我们先来看一张思维导图来了解一下Core Data
1, NSManagedObjectModel
NSManagedObjectModel 是描述应用程序的数据模型,这个模型包含实体(Entity),特性(Property),读取请求(Fetch Request)等。
2,NSManagedObjectContext
NSManagedObjectContext 参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。
3,NSPersistentStoreCoordinator
NSPersistentStoreCoordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。
4,NSManagedObject
NSManagedObject 数据对象,与 NSManagedObjectContext 相关联。
5.NSEntityDescription
NSEntityDescription是实体结构,一般我们用它来设置查询实体,来查询实体中的数据
应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。Document应用程序是一般是通过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。
NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,二进制文件等)中读取数据生成 Managed Object,或保存 Managed Object 写入数据文件。
NSManagedObjectContext 参与对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。
Array Controller, Object Controller, Tree Controller 这些控制器一般与 NSManagedObjectContext 关联,因此我们可以通过它们在 nib 中可视化地操作数据对象。
2.下面我们来创建一个表结构
我们有一个 CocoaDataDemo.xcdatamodeld 模型文件,应用程序根据它生成一个 NSManagedObjectModel 对象,这个模型有三个 Entity,每个 Entity 又可包含 Attribute Relationship, Feteched Property 三种类型的 Property。在本例中, Author Entity 包含两个Attribute : name 和 email,它们对于的运行时类均为 NSManagedObject;还包含一个与 Post 的 Relationship;没有设置 Feteched Property。
3.现在我们对表进行插入操作,代码如下
NSManagedObject *author = [NSEntityDescription insertNewObjectForEntityForName:@"Author" inManagedObjectContext:self.context];
//给这条数据中的字段赋值
[author setValue:@"jeddy" forKey:@"name"];
[author setValue:@"110@qq.com" forKey:@"email"];
NSError *error = nil;
[self.context save:&error];
if (error) {
NSLog(@"%@",error.localizedDescription);
}
[self.context save:nil];
当然我们还有一种简单的方法来插入
Author *author = [NSEntityDescription insertNewObjectForEntityForName:@"Author" inManagedObjectContext:self.context];
author.name = @"teddy";
author.email = @"@110@qq.com";
[self.context save:nil];
- NSManagedObject 常用方法
-entity 获取其 Entity
-objectID 获取其 Managed Object ID
-valueForKey: 获取指定 Property 的值
-setValue: forKey: 设定指定 Property 的值
NSManagedObjectContext 常用方法
-save: 将数据对象保存到数据文件
-objectWithID: 查询指定 Managed Object ID 的数据对象
-deleteObject: 将一个数据对象标记为删除,但是要等到 Context 提交更改时才真正删除数据对象
-undo 回滚最后一步操作,这是都 undo/redo 的支持
-lock 加锁,常用于多线程以及创建事务。同类接口还有:-unlock and -tryLock
-rollback 还原数据文件内容
-reset 清除缓存的 Managed Objects。只应当在添加或删除 Persistent Stores 时使用
-undoManager 返回当前 Context 所使用的 NSUndoManager
-assignObject: toPersistantStore: 由于 Context 可以管理从不同数据文件而来的数据对象,
这个接口的作用就是指定数据对象的存储数据文件(通过指定 PersistantStore 实现)
-executeFetchRequest: error: 执行 Fetch Request 并返回所有匹配的数据对象NSPersistentStoreCoordinator 常用方法
-addPersistentStoreForURL:configuration:URL:options:error: 装载数据存储,对应的卸载数据存储的接口为 -removePersistentStore:error:
-migratePersistentStore:toURL:options:withType:error: 迁移数据存储,效果与 “save as”相似,但是操作成功后,
迁移前的数据存储不可再使用
-managedObjectIDForURIRepresentation: 返回给定 URL所指示的数据存储的 object id,如果找不到匹配的数据存储则返回 nil
-persistentStoreForURL: 返回指定路径的 Persistent Store
-URLForPersistentStore: 返回指定 Persistent Store 的存储路径NSPersistentDocument 常用方法
-managedObjectContext 返回文档的 Managed Object Context,在多文档应用程序中,每个文档都有自己的 Context。
-managedObjectModel 返回文档的 Managed Object Model
下面我们来编写查询代码
//创建查询对象
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
//设置查询实体
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Author" inManagedObjectContext:self.context];
fetchRequest.entity = entity;
//精确查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"jeddy"];
[fetchRequest setPredicate:predicate];
//排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
//查询
NSArray *array = [self.context executeFetchRequest:fetchRequest error:nil];
if (array) {
for (NSManagedObject *obj in array) {
NSLog(@"%@ %@",[obj valueForKey:@"name"],[obj valueForKey:@"gender"]);
}
}
上面我们用了精确查找NSPredicate和排序用法,根据age的大小进行排序,ascending是升序排序.
Fetch Requests 相当于一个查询语句,你必须指定要查询的 Entity。我们通过 Fetch Requests 向 Managed Object Context 查询符合条件的数据对象,以 NSArray 形式返回查询结果,如果我们没有设置任何查询条件,则返回该 Entity 的所有数据对象。我们可以使用谓词来设置查询条件,通常会将常用的 Fetch Requests 保存到 dictionary 以重复利用。
删除和修改方法和查询差不多,删除方法用[self.context deleteObject:obj];
修改用[obj setValue:@”andy” forKey:@”name”];