1.在工程中添加build Phases的Link Binary with Libraries下添加CoreData的库。

2.在当前工程中新建文件选择CoreData——>DataModel,新建一个数据模型,往该模型中添加实体Entity,entity就是对应sqlite里面的表,一个实体对应一张表,有多个表就添加多个实体,然后往实体里面添加属性attributes,attributes就是sqlite表中的列。

3.在当前工程下右键新建CoreData ——>NSManageObject subclass,xcode会让你选择要生成的NSManageObjct subclass 的数据模型和实体,也就是说要生成对象模型所对应的数据库和表,添加完成后,新生成的对象模型里面有@dynamic 标记的对象,这是说对象的setter和getter方法由手动完成。

4.在使用CoreData的源文件中添加头

#import <CoreData/CoreData.h>

5.CoreData使用需要用到三个对象:

(1).NSManagedObjectContext

(2).NSManagedObjectModel

(3).NSPersistentStoreCoordinator

NSManagedObjectContext是进行数据持久化时的上下文,NSManagedObjectContext初始化时需要指定:NSPersistentStoreCoordinator

NSPersistentStoreCoordinator是数据持久化的助手,初始化时需要指定数据持久化时用到的数据存储类型:sqlite、xml、内存。还指定路径和NSManagedObjectModel

NSManagedObjectModel是对象模型

6.在源文件中添加三个属性:

@property ( strong , nonatomic) NSManagedObjectContext * coreDataContext;
@property ( strong , nonatomic) NSManagedObjectModel * coreDataModel;
@property ( strong , nonatomic) NSPersistentStoreCoordinator * coreDataPersistent;

并且进行延迟加载初始化:

-(NSManagedObjectModel *) coreDataModel
{
if (_coreDataModel ==nil ) {
_coreDataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"resultsModel" withExtension:@"momd"]];
}
return _coreDataModel;
}
-(NSPersistentStoreCoordinator *)coreDataPersistent
{
if (_coreDataPersistent==nil) {
_coreDataPersistent = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self coreDataModel]];
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
NSURL * pathURL = [NSURL fileURLWithPath:[path stringByAppendingString:@"resultsModel.sqlite" ]];
NSError * error = nil;
NSPersistentStore * store = [ _coreDataPersistent addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:pathURL options:nil error:&error] ;
if (!store) {
[NSException raise:@"add database error" format:@"%@" ,[error localizedDescription]];
}
}
return _coreDataPersistent ;
} -(NSManagedObjectContext *) coreDataContext
{
if(_coreDataContext ==nil)
{
_coreDataContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_coreDataContext setPersistentStoreCoordinator:[self coreDataPersistent]];
}
return _coreDataContext;
}

NSManagedObjectModel需要指定对象模型xxx.momd这个是新建的CoreData:xxx.xcdatamodeld自动在bundle下生成的。

插入数据:

 Results * insertResult = [NSEntityDescription insertNewObjectForEntityForName:@"Results" inManagedObjectContext: [self  coreDataContext]];
insertResult.in = @"123";
insertResult.re = @"ok";
insertResult.reD = @"1";
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
insertResult.Time = [dateFormatter stringFromDate:[NSDate date]];
NSError * error = nil;
if(![[self coreDataContext] save: &error])
{
[NSException raise:@"save data to database error:" format:@"%@",[error localizedDescription]];
}

这里的in .re .reD .Time 分别对应实体Results里面的属性in .re .reD .Time 对它们赋值后调用 [context save:&error] 就直接保存到数据库中。

读取数据:

 NSFetchRequest * databaseFecth = [[NSFetchRequest alloc] init];
databaseFecth.entity = [NSEntityDescription entityForName:@"Results" inManagedObjectContext:[self coreDataContext]]; NSArray * objs = [[self coreDataContext] executeFetchRequest:databaseFecth error:&error];
if(error)
{
[NSException raise:@"fetch data from database error:" format:@"%@",[error localizedDescription]];
}
for (NSManagedObject * obj in objs) {
NSLog(@"%@", obj); }

需要注意的是如果直接使用_context而不是[self context] 来获取当前对象模型的上下文则会在运行时出错:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Results''

因为直接使用_context时是nil的,只有调用才不会为nil

ios开发之CoreData使用的更多相关文章

  1. iOS开发之CoreData数据存储

    iOS开发之CoreData数据存储 参考资料:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreD ...

  2. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  3. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  4. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  5. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  6. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  7. iOS开发之info.pist文件和.pch文件

    iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...

  8. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  9. iOS 开发之Block

    iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1.     按钮事件 target action 机制. 它是将一 ...

随机推荐

  1. 由SimpleAyncTaskExecutor到ListenableFutureTask

    Spring AsyncExecutor观后感 导语 本来想看下spring关于Async&Sync TaskExecutor的主要内容,看着看着发现ListenableTaskExecuto ...

  2. css中important的用处

    今天看代码时遇到一段不理解的地方. #note_content { line-height: 22px; border: #DEDEDE 1px solid; background: #FAFAFA; ...

  3. php实现快速排序

    下午练习时候,把经典排序快速排序做了,以下是我的代码 <?php /** * Created by PhpStorm. * User: Administrator * Date: 16-8-29 ...

  4. PHP json编码遇到的问题

    今天遇到了json编码解码之后中文消失的问题,一探究竟,写下这篇文章 PHP中提供了json_encode  和json_decode 这对函数 将PHP中 值转化成 字符串,但是遇到中文的时候,很容 ...

  5. spring扫描classpath下特定package,并加载具有特定注解的接口

    spring扫描classpath下特定package,并加载具有特定注解的接口. 在框架平台的开发中,通常有很多的情况通过spring配置方式来实现某些功能会使得框架平台难以使用和扩展,我们通常的做 ...

  6. React入门--------组件API

    setState 参数:nextState(object),[callback(function)] 设置nextState的某个键值.通常如果希望在某个事件或某个回调中来重新渲染组件,setStat ...

  7. 关于制作报奖PPT的小结

    从9月26日接到制作报奖材料的任务开始,6个人(不包括审查领导和美工人员)忙活了半个多月终于交稿了,翻一下时间日志,10月1日前大概投入了13个小时,10月13日交稿又讨论修改了67个小时,总共算起来 ...

  8. 在Seismic.NET下用最少的语句写出一个剖面显示程序

    用Seismic.NET开发地震剖面显示程序可以节省大量的时间,下面的代码展开了如何用最少的代码显示一个SEGY文件. // 用一行语句把 reader, pipeline, view 和 plot ...

  9. 【读书笔记】iOS-Xcode-模拟器操作的一些快捷键

    Cmd+1/2/3       可以切换模拟器的显示比例. Option+Shift     可以在模拟器中调出双指拖动效果. Option      可以在模拟器中调出双指放大缩小效果. Comma ...

  10. iOS OC内联函数 inline的详解

    inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A. ...