Core Data 的使用
2015-07-13 11:23
330 查看
iPhone应用程序开发使用Core
Data (一
相信做过iOS开发的同学们,对SDK提供的Core Data框架应该都有所耳闻,关于使用Core Data开发的优点简单说几句,也好让大家有兴趣继续阅读本文。依据官方文档描述,使用Core Data开发应用程序有如下几点优势:
1) 使用延迟加载(lazy loading)的方式减少内存负载;
2) 内置了版本跟踪和乐观锁定(optimistic locking)来支持多用户写入冲突的解决;
3) schema migration工具可以简化应对数据库结构变化的任务, 并且可以高效率的数据库原地迁移工作;
4) 方便的建立复杂的SQL语句(当数据源存储方式选择sqlite时),减少代码量;
5) 等等。。。。。相关优点有很多文章在描述,在这不多说了:)
书归正传,本篇内容主要介绍如何使用CoreData建立数据模型,都是基本操作,写出来做个记录。多上图,能更直观的说明问题。
1、 创建测试工程。
2、 创建Core Data Model文件
a) 新建文件
b) 选择 “Data Model”,点击“Next”
c) 更改数据模型名称,点击“Create”
d) 会在工程目录生成文件*BookModel.xcdatamodeld”
3、 创建Entity(对应为数据库中的Table)
a) 在如下界面,点击“Add Entity”按钮,会在“ENTITIES”处,新建一个Entity
b) 修改Entity的名称
c) 点击Attributes卡片下的“+”按钮,新增Attribute(对应数据库Table的字段)
d) 重复c步骤,新增其他Attribute
4、 创建Relationship(对应数据库Table间的关系)
a) 按照3的步骤,创建AuthorEntity
b) 创建AuthorEntity与BookeEntity的Relationship
点击Relationships卡片下的“+”按钮,新增一个Relathionship,如下图所示:
如下建立反向关系,否则Xcode编译器会报警告。这样建立了这两个Entity间的一对一关系,还可以建立一对多的关系,在此不做示范了。
如下图点击Editor Style开关可以切换图标方式显示关系
5、 创建NSManagedObject subclass
a) 焦点停在工程文件名上(一定要这样做!),新建文件,如下图,选择 “NSManagedObject subclass”,点击“Next”
b) 选择对应Model
c) 选择Entity
d) 生成Entity对应的NSManagedObject子类文件
6、 引用CoreData.framework
7、 新建一个Manager类,通过该类实现对Core Data数据的操作
a) 实例化NSManagedObjectModel
NSManagedObjectModel描述了你在程序中使用的实体的概要信息(例如Entity、Atrribute、Relationship等)。
- (NSManagedObjectModel*)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"BookModel"withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; }
b) 实例化NSManagedObjectContext
NSManagedObjectContext可以简单理解为NSManagedObject和Persistent Stores交互的中转站,通过访问CoreData框架底层的数据对象Persistence Object Stores操作数据,最终通过保存操作将从变化更新到数据文件中。
- (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContextalloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
c) 实例化NSPersistentStoreCoordinator
NSPersistentStoreCoordinator可以简单的理解为NSManagedObjectContext和Persistent ObjectStores间的协调助理。
- (NSPersistentStoreCoordinator*)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSURL *storeURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"BookModel.sqlite"]; NSError *error; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@,%@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
d) 实现获取数据的请求(Fetch Requests)
使用NSFetchRequest类来描述数据请求,利用数据请求从Persistent Store中获取数据对象。
以查询数据为例:
- (NSArray *)selectData { if(self.managedObjectContext == nil) return nil; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"BookEntity"inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; NSPredicate * predicate = [NSPredicate predicateWithFormat:@"(booknameLIKE %@)",@"平凡的世界"]; [fetchRequest setPredicate:predicate]; [fetchRequest setFetchBatchSize:5]; [fetchRequest setFetchLimit:4]; NSArray * result = [self.managedObjectContextexecuteFetchRequest:fetchRequest error:nil]; [fetchRequest release]; return result; }
好多内容,用语言无法很准确的描述出来,我也不想在这浪费时间描述了,既然我们是程序员,那代码才是我们交流的最好语言,附上测试例子代码(TestCoreData),有兴趣的可以看看。
上述内容,简单说明了如何在项目中使用CoreData,Core Data框架提供的功能很强大,内容也很多,要深入理解Core Data框架需要循序渐进,我会在后续的文章中一步步剖析Core Data,希望能对大家有所帮助。
原文地址:http://www.cnblogs.com/dyllove98/archive/2013/06/06/3122977.html
相关文章推荐
- windows 通过端口号查找应用服务名
- 数据结构:树结构笔试题目
- Http之Get/Post请求区别
- js ==与===区别
- Android 如何将一个Activity设置成窗口样式
- hdu 1548
- svn 和 git的简单使用
- storyboard 和xib的本地化的应用
- DEV-aspxgridview中的editform中上传的方法
- Linux内核学习笔记——内核内存管理方式
- MQTT协议笔记之mqtt.io项目TCP协议支持
- #笔记#圣思园 JavaWeb 第32讲——Servlet多线程同步问题,Cookie
- 关于__block和__weak的详解
- GRE写作必备句型
- system()函数
- 常用的eclipse快捷键-也适合sts
- Coloring Android Apps with Palette(译文)
- 成都优步uber司机第三组奖励政策
- 与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- MQTT协议笔记之订阅