iOS开发——数据持久化OC篇&(六)CoreData详解

CoreData详解

介绍:

在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作。当然你也可以通过别人封装之后的一些简单框架,使得你的操作更加简单(如FMDB BNRPersistence)。

Cocoa框架本身提供了CoreData这个API可方便的让开发者通过操作对象的方式在操作数据库。CoreData是一个对象图(object graph)以及持久化的管理框架。我们可以通过CoreData创对象,设置好象之间的关系,然后将其持久化(我们甚至可以使用内存数据库),或者从硬盘上将持久化后的数据加载到内存中。对象图,我们可以创建一个个的对象,并维持不同对象之间的关系,一对一,一对多等。

CoreData有大量的特性,诸如支持Redo,Undo的功能,这些很多Document based的程序中显得非常的有用。提供数据model结构变化轻量级的迁移方案。CoreData还通过Binding特性和控件的紧密结合,这样使得只需要少量的代码便可以完成强大的功能,下面是一个例子

http://www.timisted.net/blog/archive/multiple-windows-with-core-data/

存储方式

Core Data可以将数据存储为XML,二进制文件或SQLite文件。在Mac OS X 10.5 Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式。每种方法都有其优缺点,例如XML的可读性,SQLite的节约空间等。

Core Data的这一方面类似于原始的Enterprise Objects Framework(EOF)系统,但EOF中开发者可以使用相对简洁的查询方式,而在Core Data中,只能使用一个语法类似SQL子集的查询语言,称为Predicate。Core Data是标准化的,可以自由的读写Xcode数据模型文件(通常是.xcdatamodel文件)。

与EOF不同,Core Data目前没有设计多用户或多线程访问模式。模型迁移通常也需要代码,若其它开发者依赖于某个数据模型,则该数据模型的设计者可能在模型发生改变时需要与新数据模型一起提供版本转换代码。

操作简介

Core Data由相对庞大的类继承体系组成,但开发者需要关注的接口只是其中的一个相对小的子集。

一般需要定义以下Core Data的三个必备

NSPersistentStoreCoordinator *persistentStoreCoordinator;

NSManagedObjectModel *managedObjectModel;

NSManagedObjectContext *managedObjectContext;

以及使用时需要用到的

NSFetchedResultsController *fetchedResultsController;

还记得我们每次使用CoreData的时候系统都会给我们创建一些代码吗?

 1 #pragma mark - Core Data 堆栈
 2 //返回 被管理的对象上下文
 3 - (NSManagedObjectContext *)managedObjectContext
 4 {
 5     if (_managedObjectContext) {
 6         return _managedObjectContext;
 7     }
 8
 9     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
10     if (coordinator) {
11         _managedObjectContext = [[NSManagedObjectContext alloc] init];
12         [_managedObjectContext setPersistentStoreCoordinator:coordinator];
13     }
14     return _managedObjectContext;
15 }
16
17 // 返回 持久化存储协调者
18 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
19 {
20     if (_persistentStoreCoordinator) {
21         return _persistentStoreCoordinator;
22     }
23
24     NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataNotes.sqlite"];
25
26     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
27
28     [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
29                       configuration:nil
30                                 URL:storeURL
31                             options:nil
32                               error:nil];
33
34     return _persistentStoreCoordinator;
35 }
36
37 //  返回 被管理的对象模型
38 - (NSManagedObjectModel *)managedObjectModel
39 {
40     if (_managedObjectModel) {
41         return _managedObjectModel;
42     }
43     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataNotes" withExtension:@"momd"];
44     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
45     return _managedObjectModel;
46 }
47
48 #pragma mark - 应用程序沙箱
49 // 返回应用程序Docment目录的NSURL类型
50 - (NSURL *)applicationDocumentsDirectory
51 {
52     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
53 }

下面是使用Core的示例代码

  1 static NoteDAO *sharedManager = nil;
  2
  3 + (NoteDAO*)sharedManager
  4 {
  5     static dispatch_once_t once;
  6     dispatch_once(&once, ^{
  7
  8         sharedManager = [[self alloc] init];
  9         [sharedManager managedObjectContext];
 10
 11     });
 12     return sharedManager;
 13 }
 14
 15
 16 //插入Note方法
 17 -(int) create:(Note*)model
 18 {
 19
 20     NSManagedObjectContext *cxt = [self managedObjectContext];
 21
 22     NoteManagedObject *note = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:cxt];
 23     [note setValue: model.content forKey:@"content"];
 24     [note setValue: model.date forKey:@"date"];
 25
 26     note.date = model.date;
 27     note.content = model.content;
 28
 29     NSError *savingError = nil;
 30     if ([self.managedObjectContext save:&savingError]){
 31         NSLog(@"插入数据成功");
 32     } else {
 33         NSLog(@"插入数据失败");
 34         return -1;
 35     }
 36
 37     return 0;
 38 }
 39
 40 //删除Note方法
 41 -(int) remove:(Note*)model
 42 {
 43
 44     NSManagedObjectContext *cxt = [self managedObjectContext];
 45
 46     NSEntityDescription *entityDescription = [NSEntityDescription
 47                                               entityForName:@"Note" inManagedObjectContext:cxt];
 48
 49     NSFetchRequest *request = [[NSFetchRequest alloc] init];
 50     [request setEntity:entityDescription];
 51
 52     NSPredicate *predicate = [NSPredicate predicateWithFormat:
 53                               @"date =  %@", model.date];
 54     [request setPredicate:predicate];
 55
 56     NSError *error = nil;
 57     NSArray *listData = [cxt executeFetchRequest:request error:&error];
 58     if ([listData count] > 0) {
 59         NoteManagedObject *note = [listData lastObject];
 60         [self.managedObjectContext deleteObject:note];
 61
 62         NSError *savingError = nil;
 63         if ([self.managedObjectContext save:&savingError]){
 64             NSLog(@"删除数据成功");
 65         } else {
 66             NSLog(@"删除数据失败");
 67             return -1;
 68         }
 69     }
 70
 71     return 0;
 72 }
 73
 74 //修改Note方法
 75 -(int) modify:(Note*)model
 76 {
 77     NSManagedObjectContext *cxt = [self managedObjectContext];
 78
 79     NSEntityDescription *entityDescription = [NSEntityDescription
 80                                               entityForName:@"Note" inManagedObjectContext:cxt];
 81
 82     NSFetchRequest *request = [[NSFetchRequest alloc] init];
 83     [request setEntity:entityDescription];
 84
 85     NSPredicate *predicate = [NSPredicate predicateWithFormat:
 86                               @"date =  %@", model.date];
 87     [request setPredicate:predicate];
 88
 89     NSError *error = nil;
 90     NSArray *listData = [cxt executeFetchRequest:request error:&error];
 91     if ([listData count] > 0) {
 92         NoteManagedObject *note = [listData lastObject];
 93         note.content = model.content;
 94
 95         NSError *savingError = nil;
 96         if ([self.managedObjectContext save:&savingError]){
 97             NSLog(@"修改数据成功");
 98         } else {
 99             NSLog(@"修改数据失败");
100             return -1;
101         }
102     }
103     return 0;
104 }
105
106 //查询所有数据方法
107 -(NSMutableArray*) findAll
108 {
109     NSManagedObjectContext *cxt = [self managedObjectContext];
110
111     NSEntityDescription *entityDescription = [NSEntityDescription
112                                               entityForName:@"Note" inManagedObjectContext:cxt];
113
114     NSFetchRequest *request = [[NSFetchRequest alloc] init];
115     [request setEntity:entityDescription];
116
117     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
118     [request setSortDescriptors:@[sortDescriptor]];
119
120     NSError *error = nil;
121     NSArray *listData = [cxt executeFetchRequest:request error:&error];
122
123     NSMutableArray *resListData = [[NSMutableArray alloc] init];
124
125     for (NoteManagedObject *mo in listData) {
126         Note *note = [[Note alloc] init];
127         note.date = mo.date;
128         note.content = mo.content;
129         [resListData addObject:note];
130     }
131
132     return resListData;
133 }
134
135 //按照主键查询数据方法
136 -(Note*) findById:(Note*)model
137 {
138     NSManagedObjectContext *cxt = [self managedObjectContext];
139
140     NSEntityDescription *entityDescription = [NSEntityDescription
141                                               entityForName:@"Note" inManagedObjectContext:cxt];
142
143     NSFetchRequest *request = [[NSFetchRequest alloc] init];
144     [request setEntity:entityDescription];
145
146     NSPredicate *predicate = [NSPredicate predicateWithFormat:
147                               @"date =  %@",model.date];
148     [request setPredicate:predicate];
149
150     NSError *error = nil;
151     NSArray *listData = [cxt executeFetchRequest:request error:&error];
152
153     if ([listData count] > 0) {
154         NoteManagedObject *mo = [listData lastObject];
155
156         Note *note = [[Note alloc] init];
157         note.date = mo.date;
158         note.content = mo.content;
159
160         return note;
161     }
162     return nil;
163 }
时间: 2024-10-05 04:45:33

iOS开发——数据持久化OC篇&(六)CoreData详解的相关文章

iOS开发——数据持久化OC篇&(三)对象归档

归档 iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 /

iOS开发——数据持久化OC篇&总结

数据持久化总结 1 //1.沙盒:/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 2 /** 3 // 1.获取程序的Home目录 4 NSString *home = NSHomeDirectory(); 5 NSLog(@"应用程序目录:%@", home); 6 7 // 2.获取Documents目录 8

iOS开发——数据持久化OC篇&(五)SQLite3详解

SQLite3详解 SQLite是嵌入式的和轻量级的SQL数据库.SQLite是由C实现的.广泛用于包括浏览器(支持HTML5的大部分浏览器,IE除外).iOS.Android以及一些便携需求的小型web应用系统. 1 使用原因:存储.检索信息 2 SQLite是MySQL精简版.但无需服务器就能进行. 3 两个限制:1)必须手动创建数据库 2)没有面向对象的接口. 4 如何手动创建数据库. 使用SQLite前的准备 使用SQLite是很多做iOS开发中第一次面对C的情况,包括我.因为SQLit

iOS开发——数据持久化OC篇&(一)沙盒详解

沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行. 通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容

iOS开发——数据持久化OC篇&(二)属性列表

属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -writeToFile:atomically:该方法把NSArray对象写入到属性列表文件中,第一个参

iOS开发——数据持久化OC篇&(七)CoreData高级常识

CoreData高级常识 关于CoreData貌似实际开发中很少用到,基本上是个有九个公司不会使用它,因为都说是性能不好,但是作为一个程序员,了解及其使用时必须了, 下面是我从一位大神那里搬过来的一下Core详细介绍,相信以后总有一天会帮我解决不少学习CoreData中的问题! 一.技术概览 1. Core Data 功能初窥 对于处理诸如对象生命周期管理.对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案.它有以下特性. (注:对象图-Object graph的解释:在面

iOS开发——数据持久化OC篇&文件系统总结

文件系统总结 包系统 就是app程序本身,其实是个zip包,资源/可执行文件 都在里面 + (NSBundle *)mainBundle 得到程序本身的bundle类. NSBundle提供了很多path相关函数 运行期只读,不可写 没有必要建立子文件夹,苹果不推荐在包中建立子文件夹 + (UIImage *)imageNamed:(NSString *)name 可以直接加载包中的图片文件 包中带有的数据不能太多,不然不利于用户安装 NSBundle pathForResource:ofTyp

iOS开发——数据持久化OC篇&(四)偏好设置

偏好设置 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如,保存用户名.字体大小.是否自动登录 存储位置: 存储形式: 二.代码示例 1.storyboard 2.代码 1 // 2 // YYViewController.m 3 // 01-偏好设置 4 // 5 // Created by apple on 14-6-7. 6 /

iOS开发——数据持久化OC篇&plist文件增删改查操作

Plist文件增删查改 主要操作: 1.//获得plist路径    -(NSString*)getPlistPath: 2.//判断沙盒中名为plistname的文件是否存在    -(BOOL) isPlistFileExists: 3.//读取沙盒中Document文件夹下的BookList.plist文件 [NSMutableDictionarydictionaryWithContentsOfFile:plistPath]; 4.//写入文件     if ([plistDictiona