zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    Greedy Gift Givers 贪婪的送礼者
    USACO 1.1.3 Friday the Thirteenth 黑色星期五
    Prime Matrix(暴力出奇迹)
    博弈论
    好车牌
    C语言中动态内存的分配(malloc,realloc)
    Saruman's Army(贪心)
    Python练习——循环2
    Fox and Number Game
    Repair the Wall (贪心)
  • 原文地址:https://www.cnblogs.com/jackljf/p/4768605.html
Copyright © 2011-2022 走看看