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,希望能对大家有所帮助。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值