Cor

@简单的说,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的使用。

*概念图*


@添加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

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.   
  15. @interface HMTCoreDataManager : NSObject  
  16.   
  17. @property (nonatomic,strong)NSManagedObjectContext *managedObjectContext;  //  托管对象上下文  
  18.   
  19. /** 
  20.  *  创建一个单例对象 
  21.  * 
  22.  *  @return 单例对象 
  23.  */  
  24. + (HMTCoreDataManager *)defaultManager;  
  25.   
  26. /** 
  27.  *  根据实体描述获得托管对象 
  28.  * 
  29.  *  @param entityName  指定实体描述名字 
  30.  *  @param aClass      要获取的托管对象 
  31.  * 
  32.  *  @return  托管对象实例 
  33.  */  
  34.   
  35. - (NSManagedObject *)managedObjectWithEntityName:(NSString *)entityName managedObjectClass:(Class)aClass;  
  36.   
  37. /** 
  38.  *  数据存储到磁盘中成功和失败响应的方法,参数为2个block 
  39.  * 
  40.  *  @param aSuccessedHandler 
  41.  *  @param aFailedHandler     
  42.  */  
  43. - (void)saveWithSuccessedHandler:(HandleSaveSuccessedBlock)aSuccessedHandler failedHandler:(HandleSaveFailedBlock)aFailedHandler;  
  44.   
  45.   
  46. //  插入数据  
  47. - (void)insertCoreData;  
  48.   
  49.   
  50. //  查询  
  51. - (NSMutableArray*)selectData:(NSString *)name;  
  52.   
  53.   
  54. //  删除  
  55. - (void)deleteData:(NSManagedObject *)object;  
  56.   
  57.   
  58. //  更新  
  59. - (void)updateData:(NSString* )newName;  
  60.   
  61. @end  
.m

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import "HMTCoreDataManager.h"  
  2.   
  3. @interface HMTCoreDataManager ()  
  4.   
  5. @property (nonatomic,strongNSPersistentStoreCoordinator *persistentStoreCoordinator;  //  持久化存储协调器  
  6. @property (nonatomic,strongNSManagedObjectModel * managedObjectModel;  //  托管对象模型  
  7.   
  8.   
  9. @end  
  10.   
  11. @implementation HMTCoreDataManager  
  12.   
  13. static HMTCoreDataManager *manager = nil;  
  14. + (HMTCoreDataManager *)defaultManager{  
  15.   
  16.     @synchronized(self){  
  17.       
  18.         if (manager == nil) {  
  19.             manager = [[HMTCoreDataManager alloc] init];  
  20.         }  
  21.     }  
  22.   
  23. /* 
  24.     //  通过GCD创建 
  25.     static dispatch_once_t onceToken; 
  26.     dispatch_once(&onceToken,^{ 
  27.      
  28.         manager = [[HMTCoreDataManager alloc] init]; 
  29.          
  30.     }); 
  31. */  
  32.     return manager;  
  33. }  
  34.   
  35. #pragma mark - 属性的方便之处能在get方法中初始化  
  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 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

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


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

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ------------------class-------------------------------  
  2. @class HMTStudent, HMTTeacher;  
  3. @interface HMTClass : NSManagedObject  
  4.   
  5. @property (nonatomicretainNSString * name;  
  6. @property (nonatomicretainNSSet *students;  
  7. @property (nonatomicretainHMTTeacher *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 (nonatomicretainNSString * name;  
  36. @property (nonatomicretainNSString * course;  
  37. @property (nonatomicretainHMTClass *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 (nonatomicretainNSString * name;  
  57. @property (nonatomicretainNSNumber * age;  
  58. @property (nonatomicretainHMTTeacher *teacher;  
  59. @property (nonatomicretainHMTClass *myClass;  
  60.   
  61. @end  
  62.   
  63. #import "HMTStudent.h"  
  64. #import "HMTClass.h"  
  65. #import "HMTTeacher.h"  
  66.   
  67.   
  68. @implementation HMTStudent  
  69.   
  70. @dynamic name;  
  71. @dynamic age;  
  72. @dynamic teacher;  
  73. @dynamic myClass;  
  74.   
  75. @end  

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

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值