CoreData 基本操作方法封装

转:http://blog.csdn.net/marujunyy/article/details/18500523

为了方便使用CoreData 封装了几个扩展类,使用方法和类文件如下:

  1. //首先需要在AppDelegate中的 application:didFinishLaunchingWithOptions:中调用:[CoreDataUtil launch];  
  2.   
  3. //使用方法:model中有2个表User、Bank;其中User表中的RelationShip:user对应多条Bank记录  
  4.   
  5. /* 清空User表 */  
  6. [NSManagedObject cleanTable:NSStringFromClass([User class])];  
  7.   
  8. /* 像User表插入一条数据 */  
  9. NSDictionary *userDic = @{@"name":@"jizhi",@"age":@(23),@"bank":@[@{@"account":@"111111"},@{@"account":@"222222"}]};  
  10. User *user = (User *)[NSManagedObject addObject_sync:userDic toTable:NSStringFromClass([User class])];  
  11. NSLog(@"user ----> %@",user);  
  12.   
  13. /* 修改刚刚插入的数据 */  
  14. userDic = @{@"name":@"jizhi",@"age":@(23),@"bank":@[@{@"account":@"444444"},@{@"account":@"555555"},@{@"account":@"666666"}]};  
  15. user = (User *)[NSManagedObject updateObject_sync:user params:userDic];  
  16. NSLog(@"user ----> %@",user);  
  17.   
  18. /* 查询User表中的所有记录 */  
  19. NSArray *array = [NSManagedObject getTable_sync:NSStringFromClass([User class]) predicate:nil];  
  20. NSLog(@"array ----> %@",[array firstObject]);  


NSManagedObject+Explain 为数据库的几个基本操作:增删改查 ,所有操作在同一个线程中进行;

所有的数据库操作都应调用 NSManagedObject+Explain 中的方法,一般不去改变这个扩展类; 

如果还需要自定义方法,可以在 NSManagedObject+Magic 这个扩展类中添加。


3个类文件分别如下:


//  CoreDataUtil.h

  1. //  
  2. //  CoreDataUtil.h  
  3. //  CoreDataUtil  
  4. //  
  5. //  Created by marujun on 14-1-13.  
  6. //  Copyright (c) 2014年 jizhi. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10. #import "NSManagedObject+Explain.h"  
  11. #import "NSManagedObject+Magic.h"  
  12.   
  13. @interface CoreDataUtil : NSObject  
  14.   
  15. @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;  
  16. @property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;  
  17. @property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  18.   
  19. + (void)launch;  
  20.   
  21. @end  

//  CoreDataUtil.m

  1. //  
  2. //  CoreDataUtil.m  
  3. //  CoreDataUtil  
  4. //  
  5. //  Created by marujun on 14-1-13.  
  6. //  Copyright (c) 2014年 jizhi. All rights reserved.  
  7. //  
  8.   
  9. #import "CoreDataUtil.h"  
  10.   
  11. NSManagedObjectContext *globalManagedObjectContext_util;  
  12. NSManagedObjectModel *globalManagedObjectModel_util;  
  13.   
  14. @implementation CoreDataUtil  
  15. @synthesize managedObjectContext_util = _managedObjectContext_util;  
  16. @synthesize managedObjectModel_util = _managedObjectModel_util;  
  17. @synthesize persistentStoreCoordinator_util = _persistentStoreCoordinator_util;  
  18.   
  19. + (void)launch  
  20. {  
  21.     static dispatch_once_t pred = 0;  
  22.     __strong static id coreDataUtil = nil;  
  23.     dispatch_once(&pred, ^{  
  24.         coreDataUtil = [[self alloc] init];  
  25.     });  
  26. }  
  27.   
  28. - (id)init  
  29. {  
  30.     self = [super init];  
  31.     if (self) {  
  32.         //初始化模型  
  33.         [NSManagedObject asyncQueue:false actions:^{  
  34.             globalManagedObjectContext_util = [self managedObjectContext];  
  35.             globalManagedObjectModel_util = [self managedObjectModel];  
  36.         }];  
  37.     }  
  38.     return self;  
  39. }  
  40.   
  41. #pragma mark - Core Data stack  
  42.   
  43. // Returns the managed object context for the application.  
  44. - (NSManagedObjectContext *)managedObjectContext  
  45. {  
  46.     if (_managedObjectContext_util != nil) {  
  47.         return _managedObjectContext_util;  
  48.     }  
  49.       
  50.     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];  
  51.     if (coordinator != nil) {  
  52.         _managedObjectContext_util = [[NSManagedObjectContext alloc] init];  
  53.         [_managedObjectContext_util setPersistentStoreCoordinator:coordinator];  
  54.     }  
  55.     return _managedObjectContext_util;  
  56. }  
  57.   
  58. // Returns the managed object model for the application.  
  59. - (NSManagedObjectModel *)managedObjectModel  
  60. {  
  61.     if (_managedObjectModel_util != nil) {  
  62.         return _managedObjectModel_util;  
  63.     }  
  64.     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"models" withExtension:@"momd"];  
  65.     _managedObjectModel_util = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
  66.     return _managedObjectModel_util;  
  67. }  
  68.   
  69. // Returns the persistent store coordinator for the application.  
  70. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {  
  71.     if (_persistentStoreCoordinator_util != nil) {  
  72.         return _persistentStoreCoordinator_util;  
  73.     }  
  74.       
  75.     NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"models.sqlite"];  
  76.     NSError *error = nil;  
  77.     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:  
  78.                              [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,  
  79.                              [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,  
  80.                              //[NSNumber numberWithBool:YES], NSIgnorePersistentStoreVersioningOption,  
  81.                              nil];  
  82.     _persistentStoreCoordinator_util = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];  
  83.     if (![_persistentStoreCoordinator_util addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {  
  84.         NSLog(@"Unresolved error %@, %@", error, [error userInfo]);  
  85.           
  86.         // reset models data when core data change  
  87.         [userDefaults removeObjectForKey:@"AllAuthData"];  
  88.         [userDefaults synchronize];  
  89.         [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];  
  90.         _persistentStoreCoordinator_util = nil;  
  91.         return [self persistentStoreCoordinator];  
  92.     }  
  93.       
  94.     return _persistentStoreCoordinator_util;  
  95. }  
  96.   
  97.   
  98. #pragma mark - Application's Documents directory  
  99.   
  100. // Returns the URL to the application's Documents directory.  
  101. - (NSURL *)applicationDocumentsDirectory  
  102. {  
  103.     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];  
  104. }  
  105.   
  106. @end  


//  NSManagedObject+Explain.h

  1. //  
  2. //  NSManagedObject+Explain.h  
  3. //  CoreDataUtil  
  4. //  
  5. //  Created by marujun on 14-1-13.  
  6. //  Copyright (c) 2014年 jizhi. All rights reserved.  
  7. //  
  8.   
  9. #import <CoreData/CoreData.h>  
  10.   
  11. @interface NSManagedObject (Explain)  
  12.   
  13. //异步执行任务  
  14. + (void)addObject_async:(NSDictionary *)dictionary toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete;  
  15. + (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete;  
  16. + (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete;  
  17. + (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete;  
  18. + (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete;  
  19. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete;  
  20. + (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete;  
  21. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete;  
  22.   
  23. //同步执行任务  
  24. + (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary toTable:(NSString *)tableName;  
  25. + (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName;  
  26. + (BOOL)deleteObjects_sync:(NSArray *)manyObject;  
  27. + (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params;  
  28. + (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params;  
  29. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate;  
  30. + (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions;  
  31. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors;  
  32.   
  33. //是否在异步队列中操作数据库  
  34. + (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions;  
  35.   
  36. @end  


//  NSManagedObject+Explain.m

  1. //  
  2. //  NSManagedObject+Explain.m  
  3. //  CoreDataUtil  
  4. //  
  5. //  Created by marujun on 14-1-13.  
  6. //  Copyright (c) 2014年 jizhi. All rights reserved.  
  7. //  
  8.   
  9. #import "NSManagedObject+Explain.h"  
  10. #import "CoreDataUtil.h"  
  11.   
  12. #define SuppressPerformSelectorLeakWarning(Stuff)   
  13. do {   
  14. _Pragma("clang diagnostic push")   
  15. _Pragma("clang diagnostic ignored "-Warc-performSelector-leaks"")   
  16. Stuff;   
  17. _Pragma("clang diagnostic pop")   
  18. while (0)  
  19.   
  20. static dispatch_queue_t myCustomQueue;  
  21.   
  22. extern NSManagedObjectContext *globalManagedObjectContext_util;  
  23. extern NSManagedObjectModel *globalManagedObjectModel_util;  
  24.   
  25. @implementation NSManagedObject (Explain)  
  26.   
  27. //异步执行任务  
  28. + (void)addObject_async:(NSDictionary *)dictionary  toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete  
  29. {  
  30.     [self asyncQueue:true actions:^{  
  31.         __block NSManagedObject *oneObject = [self addObject:dictionary toTable:tableName];  
  32.         [self save:^(NSError *error) { error?oneObject=nil:nil; }];  
  33.         if (complete) {  
  34.             complete(oneObject);  
  35.         }  
  36.     }];  
  37. }  
  38. + (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete  
  39. {  
  40.     [self asyncQueue:true actions:^{  
  41.         __block NSArray *resultArray = [self addObjectsFromArray:otherArray toTable:tableName];  
  42.         [self save:^(NSError *error) { error?resultArray=@[]:nil; }];  
  43.         if (complete) {  
  44.             complete(resultArray);  
  45.         }  
  46.     }];  
  47. }  
  48. + (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete  
  49. {  
  50.     [self asyncQueue:true actions:^{  
  51.         [self deleteObjects:manyObject];  
  52.         __block BOOL success = true;  
  53.         [self save:^(NSError *error) { error?success=false:true; }];  
  54.         if (complete) {  
  55.             complete(success);  
  56.         }  
  57.     }];  
  58. }  
  59. + (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete  
  60. {  
  61.     [self asyncQueue:true actions:^{  
  62.         __block NSArray *resultArray = [self updateTable:tableName predicate:predicate params:params];  
  63.         [self save:^(NSError *error) { error?resultArray=@[]:nil; }];  
  64.         if (complete) {  
  65.             complete(resultArray);  
  66.         }  
  67.     }];  
  68. }  
  69. + (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete  
  70. {  
  71.     [self asyncQueue:true actions:^{  
  72.         __block NSManagedObject *oneObject = [self updateObject:object params:params];  
  73.         [self save:^(NSError *error) { error?oneObject=nil:nil; }];  
  74.         if (complete) {  
  75.             complete(oneObject);  
  76.         }  
  77.     }];  
  78. }  
  79. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete  
  80. {  
  81.     [self getTable_async:tableName predicate:predicate sortDescriptors:nil complete:complete];  
  82. }  
  83. + (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete  
  84. {  
  85.     [self asyncQueue:true actions:^{  
  86.         NSArray *resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];  
  87.         if (complete) {  
  88.             complete(resultArr);  
  89.         }  
  90.     }];  
  91. }  
  92. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete  
  93. {  
  94.     [self asyncQueue:true actions:^{  
  95.         NSArray *resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];  
  96.         if (complete) {  
  97.             complete(resultArr);  
  98.         }  
  99.     }];  
  100. }  
  101.   
  102. //同步执行任务  
  103. + (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary  toTable:(NSString *)tableName  
  104. {  
  105.     __block NSManagedObject *oneObject = nil;  
  106.     [self asyncQueue:false actions:^{  
  107.         oneObject = [self addObject:dictionary toTable:tableName];  
  108.         [self save:^(NSError *error) { error?oneObject=nil:nil; }];  
  109.     }];  
  110.     return oneObject;  
  111. }  
  112. + (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName  
  113. {  
  114.     __block NSArray *resultArr = nil;  
  115.     [self asyncQueue:false actions:^{  
  116.         resultArr = [self addObjectsFromArray:otherArray toTable:tableName];  
  117.         [self save:^(NSError *error) { error?resultArr=@[]:nil; }];  
  118.     }];  
  119.     return resultArr;  
  120. }  
  121. + (BOOL)deleteObjects_sync:(NSArray *)manyObject  
  122. {  
  123.     __block BOOL success = true;  
  124.     [self asyncQueue:false actions:^{  
  125.         [self deleteObjects:manyObject];  
  126.         [self save:^(NSError *error) { error?success=false:true; }];  
  127.     }];  
  128.     return success;  
  129. }  
  130. + (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params  
  131. {  
  132.     __block NSArray *resultArray = nil;  
  133.     [self asyncQueue:false actions:^{  
  134.         resultArray = [self updateTable:tableName predicate:predicate params:params];  
  135.         [self save:^(NSError *error) { error?resultArray=@[]:nil; }];  
  136.     }];  
  137.     return resultArray;  
  138. }  
  139. + (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params  
  140. {  
  141.     __block NSManagedObject *oneObject = nil;  
  142.     [self asyncQueue:false actions:^{  
  143.         oneObject = [self updateObject:object params:params];  
  144.         [self save:^(NSError *error) { error?oneObject=nil:nil; }];  
  145.     }];  
  146.     return oneObject;  
  147. }  
  148. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate  
  149. {  
  150.     return [self getTable_sync:tableName predicate:predicate sortDescriptors:nil];  
  151. }  
  152. + (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions  
  153. {  
  154.     __block NSArray *resultArr = nil;  
  155.     [self asyncQueue:false actions:^{  
  156.         resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];  
  157.     }];  
  158.     return resultArr;  
  159. }  
  160. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors  
  161. {  
  162.     __block NSArray *resultArr = nil;  
  163.     [self asyncQueue:false actions:^{  
  164.         resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];  
  165.     }];  
  166.     return resultArr;  
  167. }  
  168.   
  169. //扩展方法  
  170. + (NSString *)upHeadString:(NSString *)string  
  171. {  
  172.     return [[[string substringToIndex:1] uppercaseString] stringByAppendingString:[string substringFromIndex:1]];  
  173. }  
  174. - (void)setContentDictionary:(NSDictionary *)dictionary  
  175. {  
  176.     for (NSString *key in [dictionary allKeys])  
  177.     {  
  178.         id value = [dictionary objectForKey:key];  
  179.           
  180.         if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){  
  181.             @try {  
  182.                 [self setValue:value forKey:key];  
  183.             }  
  184.             @catch (NSException *exception) {  
  185.                 NSLog(@"解析基本类型出错了-->%@",exception);  
  186.             }  
  187.               
  188.         }else if ([value isKindOfClass:[NSDictionary class]]){  
  189.             @try {  
  190.                 NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];  
  191.                 NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];  
  192.                 NSString *tableName = relationshipDescrip.destinationEntity.name;  
  193.                   
  194.                 NSManagedObject *object = [NSManagedObject addObject:value toTable:tableName];  
  195.                   
  196.                 [self setValue:object forKey:key];  
  197.             }  
  198.             @catch (NSException *exception) {  
  199.                 NSLog(@"解析字典出错了-->%@",exception);  
  200.             }  
  201.         }else if ([value isKindOfClass:[NSArray class]]){  
  202.               
  203.             @try {  
  204.                 for (NSDictionary *oneJsonObject in value)  
  205.                 {  
  206.                     NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];  
  207.                     NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];  
  208.                     NSString *tableName = relationshipDescrip.destinationEntity.name;  
  209.                       
  210.                     NSManagedObject *object = [NSManagedObject addObject:oneJsonObject toTable:tableName];  
  211.                     SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);  
  212.                     SuppressPerformSelectorLeakWarning([self performSelector:addSelector withObject:object]);  
  213.                 }  
  214.             }  
  215.             @catch (NSException *exception) {  
  216.                 NSLog(@"解析数组出错了-->%@",exception);  
  217.             }  
  218.         }  
  219.     }  
  220. }  
  221.   
  222. //在当前队列执行任务  
  223. + (NSManagedObject *)addObject:(NSDictionary *)dictionary toTable:(NSString *)tableName  
  224. {  
  225.     NSManagedObject *oneObject = nil;  
  226.     Class class = NSClassFromString(tableName);  
  227.       
  228.     NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];  
  229.     oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];  
  230.     [oneObject setContentDictionary:dictionary];  
  231.       
  232.     return oneObject;  
  233. }  
  234.   
  235. + (NSArray *)addObjectsFromArray:(NSArray *)otherArray toTable:(NSString *)tableName  
  236. {  
  237.     NSMutableArray *resultArray = [[NSMutableArray alloc] init];  
  238.       
  239.     Class class = NSClassFromString(tableName);  
  240.     NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];  
  241.       
  242.     for (NSDictionary *dictionary in otherArray)  
  243.     {  
  244.         NSManagedObject *oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];  
  245.         [oneObject setContentDictionary:dictionary];  
  246.         [resultArray addObject:oneObject];  
  247.     }  
  248.     return [resultArray copy];  
  249. }  
  250.   
  251. + (NSArray *)updateTable:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params  
  252. {  
  253.     //查询数据  
  254.     NSArray *queryArr = [self getTable:tableName predicate:predicate sortDescriptors:nil actions:nil];  
  255.       
  256.     //有匹配的记录时则更新记录  
  257.     if(queryArr && queryArr.count){  
  258.         for (NSManagedObject *object in queryArr.copy)  
  259.         {  
  260.             [self updateObject:object params:params];  
  261.         }  
  262.     } else //没有匹配的记录时添加记录  
  263.     {  
  264.         queryArr = @[[self addObject:params toTable:tableName]];  
  265.     }  
  266.     return queryArr;  
  267. }  
  268.   
  269. + (NSManagedObject *)updateObject:(NSManagedObject *)object params:(NSDictionary *)params  
  270. {  
  271.     for (NSString *key in params.allKeys)  
  272.     {  
  273.         id value = [params objectForKey:key];  
  274.           
  275.         if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){  
  276.             @try {  
  277.                 [object setValue:value forKey:key];  
  278.             }  
  279.             @catch (NSException *exception) {  
  280.                 NSLog(@"key值出错了-->%@",exception);  
  281.             }  
  282.         }else if ([value isKindOfClass:[NSDictionary class]]){  
  283.             @try {  
  284.                 NSManagedObject *otherObject = [object valueForKey:key];  
  285.                 if(otherObject){  
  286.                     [self updateObject:otherObject params:value];  
  287.                 }else{  
  288.                     NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class])  
  289.                                                                      inManagedObjectContext:globalManagedObjectContext_util];  
  290.                     NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];  
  291.                     NSString *tableName = relationshipDescrip.destinationEntity.name;  
  292.                       
  293.                     otherObject = [NSManagedObject addObject:value toTable:tableName];  
  294.                     [object setValue:otherObject forKey:key];  
  295.                 }  
  296.             }  
  297.             @catch (NSException *exception) {  
  298.                 NSLog(@"解析字典出错了-->%@",exception);  
  299.             }  
  300.         }else if ([value isKindOfClass:[NSArray class]]){  
  301.             @try {  
  302.                 NSArray *objectArray = [[object valueForKey:key] allObjects];  
  303.                   
  304.                 for (int index=0; index<[(NSArray *)value count]; index++)  
  305.                 {  
  306.                     NSDictionary *tempParams = [(NSArray *)value objectAtIndex:index];  
  307.                     if (objectArray && index<objectArray.count) {  
  308.                         [self updateObject:objectArray[index] params:tempParams];  
  309.                     }else{  
  310.                         NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([object class])  
  311.                                                                        inManagedObjectContext:globalManagedObjectContext_util];  
  312.                         NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];  
  313.                         NSString *tableName = relationshipDescrip.destinationEntity.name;  
  314.                           
  315.                         NSManagedObject *tempObject = [self addObject:tempParams toTable:tableName];  
  316.                         SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);  
  317.                         SuppressPerformSelectorLeakWarning([object performSelector:addSelector withObject:tempObject]);  
  318.                     }  
  319.                 }  
  320.             }  
  321.             @catch (NSException *exception) {  
  322.                 NSLog(@"解析数组出错了-->%@",exception);  
  323.             }  
  324.         }  
  325.     }  
  326.     return object;  
  327. }  
  328.   
  329. + (NSArray *)getTable:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors actions:(void (^)(NSFetchRequest *request))actions  
  330. {  
  331.     NSArray *resultArr = @[];  
  332.       
  333.     NSFetchRequest *request = [[NSFetchRequest alloc]init];  
  334.     NSEntityDescription *description = [NSEntityDescription entityForName:tableName inManagedObjectContext:globalManagedObjectContext_util];  
  335.     [request setEntity:description];  
  336.     if (predicate) {  
  337.         [request setPredicate:predicate];  
  338.     }  
  339.     if (sortDescriptors && sortDescriptors.count) {  
  340.         [request setSortDescriptors:sortDescriptors];  
  341.     }  
  342.     actions?actions(request):nil;  
  343.     @try {  
  344.         @synchronized(globalManagedObjectContext_util) {  
  345.             resultArr = [globalManagedObjectContext_util executeFetchRequest:request error:nil];  
  346.         }  
  347.     }  
  348.     @catch (NSException *exception) {  
  349.         NSLog(@"查询数据库出错了-->%@",exception);  
  350.     }  
  351.       
  352.     return resultArr;  
  353. }  
  354.   
  355. + (void)save:(void (^)(NSError *error))complete  
  356. {  
  357.     NSError *error;  
  358.     @synchronized(globalManagedObjectContext_util) {  
  359.         if (![globalManagedObjectContext_util save:&error]) {  
  360.             // Update to handle the error appropriately.  
  361.             NSLog(@"Unresolved error %@, %@", error, [error userInfo]);  
  362.         }  
  363.     }  
  364. }  
  365.   
  366. + (void)deleteObjects:(NSArray *)manyObject  
  367. {  
  368.     @synchronized(globalManagedObjectContext_util) {  
  369.         for (NSManagedObject *object in manyObject){  
  370.             [globalManagedObjectContext_util deleteObject:object];  
  371.         }  
  372.     }  
  373. }  
  374.   
  375. //是否在异步队列中操作数据库  
  376. + (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions  
  377. {  
  378.     static int specificKey;  
  379.     if (myCustomQueue == NULL)  
  380.     {  
  381.         myCustomQueue = dispatch_queue_create("com.jizhi.coredata", DISPATCH_QUEUE_SERIAL); //生成一个串行队列  
  382.           
  383.         CFStringRef specificValue = CFSTR("com.jizhi.coredata");  
  384.         dispatch_queue_set_specific(myCustomQueue, &specificKey, (void*)specificValue,(dispatch_function_t)CFRelease);  
  385.     }  
  386.       
  387.     NSString *retrievedValue = (NSString *)CFBridgingRelease(dispatch_get_specific(&specificKey));  
  388.     if (retrievedValue && [retrievedValue isEqualToString:@"com.jizhi.coredata"]) {  
  389.         actions ? actions() : nil;  
  390.     }else{  
  391.         if(async){  
  392.             dispatch_async(myCustomQueue, ^{  
  393.                 actions ? actions() : nil;  
  394.             });  
  395.         }else{  
  396.             dispatch_sync(myCustomQueue, ^{  
  397.                 actions ? actions() : nil;  
  398.             });  
  399.         }  
  400.     }  
  401. }  
  402.   
  403. @end 

原文地址:https://www.cnblogs.com/jackljf/p/4768605.html