CoreData是一款稳定、功能全面的持久性工具。(本文参考iphone开发3所写,比较简要,需详细了解可以参考iphone开发3)

首先创建一个新的项目CoraData,记得勾选Use Core Data:

将CoraData 添加到已有的项目中有一定复杂性,因此苹果公司为此选项提供了一些应用程序项目模板,以帮助你完成大部分工作。

点击Next,继续完成新建工程。完成以后,打开项目的目录:

你会发现项目中有一个CoreDataTest.xcdatamodeld文件,这是我们的数据模型。CoreData允许可视的方式设计数据模型,而不需要编写代码。单击该文件,你会看到数据模型编辑器:

点击左下方的Add Entity按钮,添加实体:Line。然后在代码中为这些实体创建托管对象

术语“实体”和“托管对象”可能有点令人混淆,因为两者都表示数据模型对象。术语“实体”表示对对象的描述,而“托管对象”用于在运行时创建的该实体的具体实例。因此,在数据模型编辑器中,你将创建实体,而在代码中,你将创建并检索托管对象。实体和托管对象的差异类似于类与类的实例之间的差异。

然后点击右侧Attribute下方的“+”号,添加属性LineNum,并将类型改为integer 16,添加属性LineText,类型改为string。

ok,数据模型创建完毕。

然后把界面画好吧,界面如下:

从上图可以看到有四个输入框,一个保存按钮。要做的就是输入字段之后,点击save,将字段保存起来。关闭程序,再次打开,读取持久库中的数据,并填入四个输入框里。

首先要做的是实现save按钮的实现,实现代码如下(附注释):

  1. -(void)save
  2. {
  3. //获取应用程序委托的引用,再用引用获取创建好的托管对象上下文。
  4. MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];
  5. NSManagedObjectContext *context = [delegate managedObjectContext];
  6. NSError *error;
  7. for (int i = 1; i <= 4; i++)
  8. {
  9. NSString *fieldName = [NSString stringWithFormat:@"line%d",i ];
  10. UITextField *theField = [self valueForKey:fieldName];
  11. //创建提取请求
  12. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  13. //为已创建好的实体利用检索到的上下文创建一个实体描述
  14. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
  15. inManagedObjectContext:context];
  16. //创建好了以后发送给提取请求,以便请求能够知道要查找的实体类型
  17. [request setEntity:entityDescription];
  18. //确定持久库中是否存在与此字段相对应的托管对象,所以穿件一个谓词来确定字段的正确对象:
  19. NSPredicate *pred = [NSPredicate predicateWithFormat:@"lineNum == %d",i ];
  20. [request setPredicate:pred];
  21. //由于我们还不知道是从持久库中加载托管对象还是创建新的托管对象,
  22. //所以声明一个指向NSManagedObject的指针并将他设置为nil
  23. NSManagedObject *theLine = nil;
  24. //再次在上下文中执行提取请求
  25. NSArray *objects = [context executeFetchRequest:request error:&error];
  26. if (objects == nil)
  27. {
  28. NSLog(@"There was an error!");
  29. }
  30. //检查示范返回了标准匹配的对象,若果有则加载它,如果没有则创建一个新的托管对象来保存此字段的文本
  31. if ([objects count] > 0)
  32. {
  33. theLine = [objects objectAtIndex:0];
  34. }
  35. else
  36. {
  37. theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"
  38. inManagedObjectContext:context];
  39. }
  40. //使用键值编码来设置行号以及托管对象的文本
  41. [theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"];
  42. [theLine setValue:theField.text forKey:@"lineText"];
  43. [request release];
  44. }
  45. //完成循环之后要通知上下文保存其更改
  46. [context save:&error];
  47. }

再看viewDidLoad方法,我们需要确定持久库中是否已经存在数据,如果有则加载数据并使用它填充字段。实现与save方法差不多,实现如下(附注释):

  1. //获取应用程序委托的引用,再用引用获取创建好的托管对象上下文。
  2. MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];
  3. NSManagedObjectContext *context = [delegate managedObjectContext];
  4. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
  5. inManagedObjectContext:context];;
  6. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  7. [request setEntity:entityDescription];
  8. //由于希望检索持久库中所有Line对象,因此没有创建谓词。通过执行没有谓词的请求,上下文将返回库中的每一个Line对象
  9. NSError *error;
  10. NSArray *objects = [context executeFetchRequest:request error:&error];
  11. //确保返回的是有效数组,如果不是则记录它
  12. if (objects == nil)
  13. {
  14. NSLog(@"There was an error.");
  15. }
  16. //然后使用快速枚举遍历已检索托管对象的数组,从中提取LineNum和LineText值,并使用该信息更新用户界面上的文本字段之一
  17. for (NSManagedObject *oneObject in objects)
  18. {
  19. NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
  20. NSString *lineText = [oneObject valueForKey:@"lineText"];
  21. NSString *fieldNmae = [NSString stringWithFormat:@"line%d",[lineNum intValue]];
  22. UITextField *theField = [self valueForKey:fieldNmae];
  23. theField.text = lineText;
  24. }
  25. [request release];

这样就简单的实现了Coredata的存储了。

运行程序,输入一些字段:

关闭程序,再打开,可以看到字段还在,说明保存成功。

程序demo链接:CoreDataTest Demo

转http://blog.csdn.net/sjx19871225/article/details/8705213

NSPredicate文档中文翻译

http://blog.csdn.net/sjx19871225/article/details/8691720

数据的持久性存储(二)——CoreData(附Demo)的更多相关文章

  1. Docker的volume机制实现容器数据的持久性存储

    1:可以启动一个容器的时候,临时指定挂载的volume,这个volume会自动创建,无需在宿主机上事先创建 docker run -it -v /busybox busybox:latest 登入到b ...

  2. python序列化(数据本地存放持久性存储)和反序列化

    http://blog.csdn.net/uestcyao/article/details/7874817 #读取图片并存储为矩阵 from scipy.misc import imread im = ...

  3. 006.OpenShift持久性存储

    一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...

  4. 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

    1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...

  5. Asp.net MVC集成Google Calendar API(附Demo源码)

    Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...

  6. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  7. 最新CoreData封装Demo

    1.创建CoreData文件 2. 3. 4. UploadCoreDataAPI.h // // UploadCoreDataAPI.h // dsafsda // // Created by 冯敏 ...

  8. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  9. 开源分享:谷歌大佬联合打造《高级Kotlin强化实战(附Demo)》

    Kotlin 以其简洁的特性而闻名,而在我们的实践中,更加简洁就意味着更加高效.事实上,在使用 Kotlin 的专业 Android 开发者中,有多达 67% 的人表示 Kotlin 已经帮助他们提升 ...

随机推荐

  1. LeetCode第[53]题(Java):Maximum Subarray

    题目:和最大的子序列 难度:Medium 题目内容: Given an integer array nums, find the contiguous subarray (containing at ...

  2. python学习笔记(控制语句)

    博主平时学python的时候.大多是复制网上别人现成的进行改动实现自己的测试的要求 所有python基础语法其实掌握的很差 本来想优化下接口脚本实现.发现基础的循环控制语句都不知道怎么写 所以准备整理 ...

  3. combobox里面显示checkbox

    看了http://www.cnblogs.com/yubinfeng/p/4463418.html这篇博客,我添加了部分代码,以便在最后获取combobox的value时可以拿到一个数组. HTML代 ...

  4. memcache笔记

    服务端: 通过printf配合nc向memcached中写入数据[root@yz6245 ~]# printf "set key1 0 0 6\r\noldboy\r\n" |nc ...

  5. 【转】Hibernate 原汁原味的四种抓取策略

    最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...

  6. javascript: what can javascript do?

    1.Javascript can change html content <!DOCTYPE html> <html> <body> <h2>What ...

  7. PostgreSQL copy 时提示:ERROR: invalid byte sequence for encoding "UTF8": 0xb3

    测试时使用三种文件格式: ISO-8859 Netpbm PBM image ASCII if [ $(file $filename|grep -c "ISO-8859") -gt ...

  8. Arcgis for Javascript之featureLayer图和属性的互操作

    说明:主要实现加载FeatureLayer与显示属性表,并实现属性表与地图的联动,首先,看看实现后的效果: 显示效果 如上图所示,本文章主要实现了以下几个功能:1.FeatureLayer属性表的分页 ...

  9. 用百度地图API打造方便自己使用的手机地图

    有钱人咱就不说了,因为偶是个穷银--因为穷,所以去年买的Huawei C8650+到现在还在上岗,对于没有钱买好的配置的手机的童鞋来说,类似于百度,谷歌,高德等商家的地图在自己的机器上跑起来确实是有点 ...

  10. 在C++中指针和引用传值区别

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...