@简单的说,Core Data就是能够存储到磁盘的对象图,[...]Core Data能够帮我们做非常多任务作.它能够作为软件的整个模型层。

它不只在磁盘上存储数据。也把我们须要的数据对象读取到内存中。

——Marcus Zarra, Core Data

@Core Data是Mac OS X中Cocoa API的一部分,首次在Mac OS X 10.4 Tiger与iOS 3.0系统中出现[2]。它同意依照实体-属性-值模型组织数据。并以XML,二进制文件或SQLite数据文件的格式将其串行化。Core Data同意用户使用代表实体和实体间关系的高层对象来操作数据。它也能够管理串行化的数据,提供对象生存期管理与object graph管理,包含存储。

Core Data直接与SQLite交互,避免开发人员使用原本的SQL语句,就像Cocoa绑定在模型-视图-控制器设计中做了非常多控制器的工作一样,Core
Data做了非常多数据模型的工作。它的主要任务是负责数据更改的管理。串行化到磁盘。最小化内存占用,以及查询数据。

@http://www.cocoachina.com/iphonedev/sdk/2010/1126/2397.html( 这是官方对于CoreData的说明)

@接下来,我就不利用框架自己主动生成代码,全然自己编写全部的 Core data 相关代码的命令行应用程序来深入解说 Core data的使用。



*概念图*

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG10MjAxMzA0MTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

@加入CoreData框架,导入#import<CoreData/CoreData.h>

写代码之前须要了解6个对象:

(1)NSManagedObjectContext(被管理的数据上下文)



操作实际内容(操作持久层)



作用:插入数据,查询数据,删除数据



(2)NSManagedObjectModel(被管理的数据模型)



数据库全部表格或数据结构,包括各实体的定义信息



作用:加入实体的属性。建立属性之间的关系



操作方法:视图编辑器。或代码



(3)NSPersistentStoreCoordinator(持久化存储助理)



相当于数据库的连接器



作用:设置数据存储的名字。位置,存储方式,和存储时机



(4)NSManagedObject(被管理的数据记录)



相当于数据库中的表格记录



(5)NSFetchRequest(获取数据的请求)



相当于查询语句



(6)NSEntityDescription(实体结构)



相当于表格结构



(7)后缀为.xcdatamodeld的包



里面是.xcdatamodel文件,用数据模型编辑器编辑



编译后为.momd或.mom文件

1.自己定义封装的CoreData管理类HMTCoreDataManager

.h

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3.  
  4. /**
  5. * 数据存储成功的代码块
  6. */
  7. typedef void(^HandleSaveSuccessedBlock)();
  8.  
  9. /**
  10. * 数据存储失败的代码块
  11. */
  12. typedef void(^HandleSaveFailedBlock)(NSError *);
  13.  
  14. @interface HMTCoreDataManager : NSObject
  15.  
  16. @property (nonatomic,strong)NSManagedObjectContext *managedObjectContext; // 托管对象上下文
  17.  
  18. /**
  19. * 创建一个单例对象
  20. *
  21. * @return 单例对象
  22. */
  23. + (HMTCoreDataManager *)defaultManager;
  24.  
  25. /**
  26. * 依据实体描写叙述获得托管对象
  27. *
  28. * @param entityName 指定实体描写叙述名字
  29. * @param aClass 要获取的托管对象
  30. *
  31. * @return 托管对象实例
  32. */
  33.  
  34. - (NSManagedObject *)managedObjectWithEntityName:(NSString *)entityName managedObjectClass:(Class)aClass;
  35.  
  36. /**
  37. * 数据存储到磁盘中成功和失败响应的方法,參数为2个block
  38. *
  39. * @param aSuccessedHandler
  40. * @param aFailedHandler
  41. */
  42. - (void)saveWithSuccessedHandler:(HandleSaveSuccessedBlock)aSuccessedHandler failedHandler:(HandleSaveFailedBlock)aFailedHandler;
  43.  
  44. //  插入数据
  45. - (void)insertCoreData;
  46.  
  47. //  查询
  48. - (NSMutableArray*)selectData:(NSString *)name;
  49.  
  50. //  删除
  51. - (void)deleteData:(NSManagedObject *)object;
  52.  
  53. //  更新
  54. - (void)updateData:(NSString* )newName;
  55.  
  56. @end

.m

  1. #import "HMTCoreDataManager.h"
  2.  
  3. @interface HMTCoreDataManager ()
  4.  
  5. @property (nonatomic,strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; // 持久化存储协调器
  6. @property (nonatomic,strong) NSManagedObjectModel * managedObjectModel; // 托管对象模型
  7.  
  8. @end
  9.  
  10. @implementation HMTCoreDataManager
  11.  
  12. static HMTCoreDataManager *manager = nil;
  13. + (HMTCoreDataManager *)defaultManager{
  14.  
  15. @synchronized(self){
  16.  
  17. if (manager == nil) {
  18. manager = [[HMTCoreDataManager alloc] init];
  19. }
  20. }
  21.  
  22. /*
  23. // 通过GCD创建
  24. static dispatch_once_t onceToken;
  25. dispatch_once(&onceToken,^{
  26.  
  27. manager = [[HMTCoreDataManager alloc] init];
  28.  
  29. });
  30. */
  31. return manager;
  32. }
  33.  
  34. #pragma mark - 属性的方便之处能在get方法中初始化
  35. /**
  36. * 非常多人对于这个上下文不太理解,開始我也不太理解,查了非常多资料,感觉以下这个解释比較通俗易懂
  37. * 托管对象上下文:
  38. * 托管对象上下文包括全部的托管对象,这些托管对象已经为提交给数据库准备就绪,在托管对象上下文中。能够加入、改动和删除托管对象,
  39. * 这一层相当于应用程序和数据库之间的缓冲区。
  40.  
  41. */
  42. - (NSManagedObjectContext *)managedObjectContext{
  43.  
  44. if (_managedObjectContext) {
  45. return _managedObjectContext;
  46. }
  47.  
  48. _managedObjectContext = [[NSManagedObjectContext alloc] init];
  49.  
  50. // 为托管对象上下文指定一个持久化存储协调器
  51. [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
  52.  
  53. return _managedObjectContext;
  54. }
  55.  
  56. /**
  57. * 持久化存储协调器(持久化存储助理)
  58. * 持久化存储协调器处理到数据存储的连接,而且包括一些底层信息,像用到数据存储的名字和位置
  59. * 一般我们无需与它直接打交道,上下文已经封装了对它的调用
  60. */
  61. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
  62.  
  63. if (_persistentStoreCoordinator) {
  64. return _persistentStoreCoordinator;
  65. }
  66. // 初始化一个持久化存储协调器必须依赖NSManagedObjectModel
  67. _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
  68.  
  69. // 存储路径(返回的是NSURL类型)为Documents文件夹下。以及数据库名称
  70. NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  71. NSURL *fileURL = [documentURL URLByAppendingPathComponent:@"myClass.sqlite"];
  72.  
  73. NSError *error = nil;
  74. // 载入持久化存储数据(指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库)
  75. [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:&error];
  76. if (error != nil) {
  77.  
  78. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"加入持久化存储失败" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
  79. [alert show];
  80. }
  81.  
  82. return _persistentStoreCoordinator;
  83. }
  84.  
  85. /**
  86. * 托管对象模型
  87. * 数据库全部表格或数据结构包括各实体的定义信息
  88. * 加入实体的属性,建立属性之间的关系
  89. */
  90. - (NSManagedObjectModel *)managedObjectModel{
  91.  
  92. if (_managedObjectModel) {
  93. return _managedObjectModel;
  94. }
  95.  
  96. // 获取托管对象模型文件的地址
  97. // 编译器会自己主动将"xcdatamodeld"格式转化为"momd"
  98. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myClassModel" withExtension:@"momd"];
  99. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  100.  
  101. return _managedObjectModel;
  102. }
  103.  
  104. - (NSManagedObject *)managedObjectWithEntityName:(NSString *)entityName managedObjectClass:(Class)aClass{
  105.  
  106. // 创建"HMTClass"的实体描写叙述
  107. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"HMTClassEntity" inManagedObjectContext:self.managedObjectContext];
  108.  
  109. // 通过"HMTClass"的实体描写叙述创建HMTClass的托管对象
  110. NSManagedObject *managedObject = [[aClass alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];
  111.  
  112. return managedObject;
  113. }
  114.  
  115. - (void)saveWithSuccessedHandler:(HandleSaveSuccessedBlock)aSuccessedHandler failedHandler:(HandleSaveFailedBlock)aFailedHandler{
  116.  
  117. NSError *error = nil;
  118. [self.managedObjectContext save:&error];
  119. if (error != nil) {
  120.  
  121. aFailedHandler(error);
  122.  
  123. }else {
  124.  
  125. aSuccessedHandler();
  126. }
  127.  
  128. }
  129.  
  130. @end



2.创建模型文件ManagedObject的过程





3.将创建的模型文件转化为相应的类文件

第一种:command+n

另外一种: 选中myClassModel.xcdatamodeld

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG10MjAxMzA0MTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

之后都是一样的--->选中模型文件--->选中要创建的实体

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG10MjAxMzA0MTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

最后,就会生成前面图片中的3个类,都是继承了NSManagedObject

  1. ------------------class-------------------------------
  2. @class HMTStudent, HMTTeacher;
  3. @interface HMTClass : NSManagedObject
  4.  
  5. @property (nonatomic, retain) NSString * name;
  6. @property (nonatomic, retain) NSSet *students;
  7. @property (nonatomic, retain) HMTTeacher *teacher;
  8. @end
  9.  
  10. @interface HMTClass (CoreDataGeneratedAccessors)
  11.  
  12. - (void)addStudentsObject:(HMTStudent *)value;
  13. - (void)removeStudentsObject:(HMTStudent *)value;
  14. - (void)addStudents:(NSSet *)values;
  15. - (void)removeStudents:(NSSet *)values;
  16.  
  17. @end
  18.  
  19. #import "HMTClass.h"
  20. #import "HMTStudent.h"
  21. #import "HMTTeacher.h"
  22.  
  23. @implementation HMTClass
  24.  
  25. @dynamic name;
  26. @dynamic students;
  27. @dynamic teacher;
  28.  
  29. @end
  30.  
  31. ------------------teacher-------------------------------
  32. @class HMTClass;
  33. @interface HMTTeacher : NSManagedObject
  34.  
  35. @property (nonatomic, retain) NSString * name;
  36. @property (nonatomic, retain) NSString * course;
  37. @property (nonatomic, retain) HMTClass *myClass;
  38.  
  39. @end
  40.  
  41. #import "HMTTeacher.h"
  42. #import "HMTClass.h"
  43.  
  44. @implementation HMTTeacher
  45.  
  46. @dynamic name;
  47. @dynamic course;
  48. @dynamic myClass;
  49.  
  50. @end
  51.  
  52. ------------------student-------------------------------
  53. @class HMTClass, HMTTeacher;
  54. @interface HMTStudent : NSManagedObject
  55.  
  56. @property (nonatomic, retain) NSString * name;
  57. @property (nonatomic, retain) NSNumber * age;
  58. @property (nonatomic, retain) HMTTeacher *teacher;
  59. @property (nonatomic, retain) HMTClass *myClass;
  60.  
  61. @end
  62.  
  63. #import "HMTStudent.h"
  64. #import "HMTClass.h"
  65. #import "HMTTeacher.h"
  66.  
  67. @implementation HMTStudent
  68.  
  69. @dynamic name;
  70. @dynamic age;
  71. @dynamic teacher;
  72. @dynamic myClass;
  73.  
  74. @end

4.准备工作都OK了,最后进行数据的持久化存储

  1. #pragma mark - 增删改查
  2.  
  3. // 插入数据操作(相似于FMDB做法,方法后面可带你想存储的数据对象,这里仅仅是单纯的演示)
  4. // - (void)insertCoreData:(AppleClass *)appleClass
  5. - (void)insertCoreData{
  6.  
  7. // 创建"HMTClass"的实体描写叙述,传入的正是前面标注的实体描写叙述名
  8. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"HMTClassEntity" inManagedObjectContext:self.managedObjectContext];
  9.  
  10. // 通过"HMTClass"的实体描写叙述创建HMTClass的托管对象
  11. HMTClass *hmtClass = [[HMTClass alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];
  12. // hmtClass.name = appleClass.name;
  13. hmtClass.name = @"Apple";
  14.  
  15. // 托管对象上下文将托管对象的更改保存到磁盘文件里
  16. // - save 将数据保存到数据库
  17. NSError *error = nil;
  18. [self.managedObjectContext save:&error];
  19. if (error != nil) {
  20. NSLog(@"加入失败:%@",[error localizedDescription]);
  21. }
  22.  
  23. }
  24.  
  25. // 删除数据操作
  26. - (void)deleteData:(NSManagedObject *)object{
  27.  
  28. [self.managedObjectContext deleteObject:object];
  29. NSError *error = nil;
  30. [[HMTCoreDataManager defaultManager].managedObjectContext save:&error];
  31. if (error != nil) {
  32. NSLog(@"删除失败:%@",[error localizedDescription]);
  33. }
  34.  
  35. }
  36.  
  37. // 查询数据操作(根据特定条件查询,假设是select * 就直接不写谓词推断语句)
  38. - (NSMutableArray*)selectData:(NSString *)name{
  39.  
  40. // 创建指定Entity的查询语句
  41. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"HMTClassEntity"];
  42.  
  43. // 谓词,原理和使用方法都相似于SQL中的where,作用相当于数据库的过滤取(我blog中OC分类有详细讲到)
  44. NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name == \'%@\'",name],nil];
  45. fetchRequest.predicate = predicate;
  46.  
  47. // 查询的结果按哪个key进行排序,YES为升序
  48. // NSSortDescriptor *timestampSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"classNO" ascending:YES];
  49. // fetchRequest.sortDescriptors = @[timestampSortDescriptor];
  50.  
  51. // 注意查询返回的仅仅能是NSArray类型
  52. NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
  53. NSMutableArray *resultArray = [NSMutableArray arrayWithArray:fetchedObjects];
  54.  
  55. return resultArray;
  56. }
  57.  
  58. // 更新数据操作
  59. - (void)updateData:(NSString *)newName{
  60.  
  61. // 创建指定Entity的查询语句
  62. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"HMTClassEntity"];
  63.  
  64. // 注意查询返回的仅仅能是NSArray类型
  65. NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
  66.  
  67. // 更新
  68. for (HMTClass *info in fetchedObjects) {
  69. info.name = newName;
  70. }
  71.  
  72. //保存
  73. if ([self.managedObjectContext save:nil]) {
  74. //更新成功
  75. NSLog(@"更新成功");
  76. }
  77.  
  78. }

@转载请注明:http://blog.csdn.net/hmt20130412  谢谢!

@不错的CoreData资料:

http://blog.csdn.net/rhljiayou/article/details/18037729

http://blog.csdn.net/kesalin/article/details/6739319

http://www.cnblogs.com/mybkn/articles/2472881.html

数据持久化(五)之CoreData的更多相关文章

  1. [Xcode 实际操作]七、文件与数据-(14)数据持久化存储框架CoreData的使用:删除CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何删除数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  2. [Xcode 实际操作]七、文件与数据-(13)数据持久化存储框架CoreData的使用:编辑CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何修改数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  3. [Xcode 实际操作]七、文件与数据-(12)数据持久化存储框架CoreData的使用:查找CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何查找数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  4. [Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据

    目录:[Swift]Xcode实际操作 本文将演示[CoreData]数据持久化存储框架的使用. 点击[Create a new Xcode project]创建一个新的项目 ->[Single ...

  5. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  6. ios数据持久化--CoreData框架的介绍和使用

    1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在Mac OS X 10.5Leopard及以后的版本中 ...

  7. iOS开发 - CoreData框架 数据持久化

    Core Data Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还 ...

  8. IOS - 本地数据持久化

    转:相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如“是否第一次打开”的BOOL值,大 到游戏的进度和状态等数据,都需要进行本地持久化存储.这些 ...

  9. UI:数据持久化

    数据持久化    参考1  参考2  参考3 什么是数据持久化,就是将文件保存在本地的硬盘中,使得应用程序或者机器重启后可以继续访问以前保留的数据.IOS开发中有许多的数据持久化方案. 如下面五种方案 ...

随机推荐

  1. 深入理解Java虚拟机 - Java体系

    使用JAVA已经快三年了,但说来惭愧,一直以来认为Java就是Java语言本身,最多再包括一个JVM,对于整个Java的体系结构还是不甚明了,现在有时间把<深入理解Java虚拟机>这本书读 ...

  2. jquery Ajax应用总结

    常见应用: 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET&quo ...

  3. C# 中winform的一些属性设置

    1 窗体的大小固定住,不能调整其大小 窗体FormBorderStyle 属性设置为 FixedSingle; MaximizeBox 属性设置为false; MinimizeBox  属性设置为  ...

  4. jdbc三种常见用法

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  5. tcxtreelist 展示图片 图像

    procedure TfrmstPostImageCollate.LoadCollateImage(AOrderID: integer);var mySql: string; node: TcxTre ...

  6. Python脚本控制的WebDriver 常用操作 <二十三> wait

    测试用例场景 Wait类的使用场景是在页面上进行某些操作,然后页面上就会出现或隐藏一些元素,此时使用Wait类的until方法来等待这些效果完成以便进行后续的操作.另外页面加载时有可能会执行一些aja ...

  7. DNS (二)协议

    报文字段含义: 标识字段 由客户程序设置并由服务器返回结果.客户程序通过它来确定响应与查询是否匹配. 标志字段 协商具体的通信方式和反馈通信状态随后的 4个16 bit字段说明最后 4个变长字段中包含 ...

  8. GIS中相交的定义(OGC相交的定义)

    我们常用GIS中的相交,比如在地图漫游的时候,屏幕显示的图形和屏幕这个包络线就是相交的关系.我们常用的GIS工具,拉框查询,这个用到的也是相交. 首先题目开起来很简单(开始的时候我是这样想的),但是做 ...

  9. 企业移动互联网O2O微信支付流程图

    过去一周里最受关注的应该就是微信了,腾讯合作伙伴大会微信分论坛的火爆现场,没有亲临其境是无法想象的,近3000人报名,2000多人来到现场,试图进入只能容纳300人的会场…… 闲话不表,进入正题吧,本 ...

  10. Good practice release jar to Nexus

    Step  suppose you need to develop a feature,when you finish the feature ,you need to release the jar ...