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

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

  1. //首先需要在AppDelegate中的 application:didFinishLaunchingWithOptions:中调用:[CoreDataUtil launch];
  2. //使用方法:model中有2个表User、Bank;其中User表中的RelationShip:user对应多条Bank记录
  3. /* 清空User表 */
  4. [NSManagedObject cleanTable:NSStringFromClass([User class])];
  5. /* 像User表插入一条数据 */
  6. NSDictionary *userDic = @{@"name":@"jizhi",@"age":@(23),@"bank":@[@{@"account":@"111111"},@{@"account":@"222222"}]};
  7. User *user = (User *)[NSManagedObject addObject_sync:userDic toTable:NSStringFromClass([User class])];
  8. NSLog(@"user ----> %@",user);
  9. /* 修改刚刚插入的数据 */
  10. userDic = @{@"name":@"jizhi",@"age":@(23),@"bank":@[@{@"account":@"444444"},@{@"account":@"555555"},@{@"account":@"666666"}]};
  11. user = (User *)[NSManagedObject updateObject_sync:user params:userDic];
  12. NSLog(@"user ----> %@",user);
  13. /* 查询User表中的所有记录 */
  14. NSArray *array = [NSManagedObject getTable_sync:NSStringFromClass([User class]) predicate:nil];
  15. 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. #import <Foundation/Foundation.h>
  9. #import "NSManagedObject+Explain.h"
  10. #import "NSManagedObject+Magic.h"
  11. @interface CoreDataUtil : NSObject
  12. @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
  13. @property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  14. @property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  15. + (void)launch;
  16. @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. #import "CoreDataUtil.h"
  9. NSManagedObjectContext *globalManagedObjectContext_util;
  10. NSManagedObjectModel *globalManagedObjectModel_util;
  11. @implementation CoreDataUtil
  12. @synthesize managedObjectContext_util = _managedObjectContext_util;
  13. @synthesize managedObjectModel_util = _managedObjectModel_util;
  14. @synthesize persistentStoreCoordinator_util = _persistentStoreCoordinator_util;
  15. + (void)launch
  16. {
  17. static dispatch_once_t pred = 0;
  18. __strong static id coreDataUtil = nil;
  19. dispatch_once(&pred, ^{
  20. coreDataUtil = [[self alloc] init];
  21. });
  22. }
  23. - (id)init
  24. {
  25. self = [super init];
  26. if (self) {
  27. //初始化模型
  28. [NSManagedObject asyncQueue:false actions:^{
  29. globalManagedObjectContext_util = [self managedObjectContext];
  30. globalManagedObjectModel_util = [self managedObjectModel];
  31. }];
  32. }
  33. return self;
  34. }
  35. #pragma mark - Core Data stack
  36. // Returns the managed object context for the application.
  37. - (NSManagedObjectContext *)managedObjectContext
  38. {
  39. if (_managedObjectContext_util != nil) {
  40. return _managedObjectContext_util;
  41. }
  42. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  43. if (coordinator != nil) {
  44. _managedObjectContext_util = [[NSManagedObjectContext alloc] init];
  45. [_managedObjectContext_util setPersistentStoreCoordinator:coordinator];
  46. }
  47. return _managedObjectContext_util;
  48. }
  49. // Returns the managed object model for the application.
  50. - (NSManagedObjectModel *)managedObjectModel
  51. {
  52. if (_managedObjectModel_util != nil) {
  53. return _managedObjectModel_util;
  54. }
  55. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"models" withExtension:@"momd"];
  56. _managedObjectModel_util = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  57. return _managedObjectModel_util;
  58. }
  59. // Returns the persistent store coordinator for the application.
  60. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  61. if (_persistentStoreCoordinator_util != nil) {
  62. return _persistentStoreCoordinator_util;
  63. }
  64. NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"models.sqlite"];
  65. NSError *error = nil;
  66. NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
  67. [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
  68. [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
  69. //[NSNumber numberWithBool:YES], NSIgnorePersistentStoreVersioningOption,
  70. nil];
  71. _persistentStoreCoordinator_util = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  72. if (![_persistentStoreCoordinator_util addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
  73. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  74. // reset models data when core data change
  75. [userDefaults removeObjectForKey:@"AllAuthData"];
  76. [userDefaults synchronize];
  77. [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
  78. _persistentStoreCoordinator_util = nil;
  79. return [self persistentStoreCoordinator];
  80. }
  81. return _persistentStoreCoordinator_util;
  82. }
  83. #pragma mark - Application's Documents directory
  84. // Returns the URL to the application's Documents directory.
  85. - (NSURL *)applicationDocumentsDirectory
  86. {
  87. return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  88. }
  89. @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. #import <CoreData/CoreData.h>
  9. @interface NSManagedObject (Explain)
  10. //异步执行任务
  11. + (void)addObject_async:(NSDictionary *)dictionary toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete;
  12. + (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete;
  13. + (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete;
  14. + (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete;
  15. + (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete;
  16. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete;
  17. + (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete;
  18. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete;
  19. //同步执行任务
  20. + (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary toTable:(NSString *)tableName;
  21. + (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName;
  22. + (BOOL)deleteObjects_sync:(NSArray *)manyObject;
  23. + (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params;
  24. + (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params;
  25. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate;
  26. + (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions;
  27. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors;
  28. //是否在异步队列中操作数据库
  29. + (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions;
  30. @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. #import "NSManagedObject+Explain.h"
  9. #import "CoreDataUtil.h"
  10. #define SuppressPerformSelectorLeakWarning(Stuff) \
  11. do { \
  12. _Pragma("clang diagnostic push") \
  13. _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
  14. Stuff; \
  15. _Pragma("clang diagnostic pop") \
  16. } while (0)
  17. static dispatch_queue_t myCustomQueue;
  18. extern NSManagedObjectContext *globalManagedObjectContext_util;
  19. extern NSManagedObjectModel *globalManagedObjectModel_util;
  20. @implementation NSManagedObject (Explain)
  21. //异步执行任务
  22. + (void)addObject_async:(NSDictionary *)dictionary  toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete
  23. {
  24. [self asyncQueue:true actions:^{
  25. __block NSManagedObject *oneObject = [self addObject:dictionary toTable:tableName];
  26. [self save:^(NSError *error) { error?oneObject=nil:nil; }];
  27. if (complete) {
  28. complete(oneObject);
  29. }
  30. }];
  31. }
  32. + (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete
  33. {
  34. [self asyncQueue:true actions:^{
  35. __block NSArray *resultArray = [self addObjectsFromArray:otherArray toTable:tableName];
  36. [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
  37. if (complete) {
  38. complete(resultArray);
  39. }
  40. }];
  41. }
  42. + (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete
  43. {
  44. [self asyncQueue:true actions:^{
  45. [self deleteObjects:manyObject];
  46. __block BOOL success = true;
  47. [self save:^(NSError *error) { error?success=false:true; }];
  48. if (complete) {
  49. complete(success);
  50. }
  51. }];
  52. }
  53. + (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete
  54. {
  55. [self asyncQueue:true actions:^{
  56. __block NSArray *resultArray = [self updateTable:tableName predicate:predicate params:params];
  57. [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
  58. if (complete) {
  59. complete(resultArray);
  60. }
  61. }];
  62. }
  63. + (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete
  64. {
  65. [self asyncQueue:true actions:^{
  66. __block NSManagedObject *oneObject = [self updateObject:object params:params];
  67. [self save:^(NSError *error) { error?oneObject=nil:nil; }];
  68. if (complete) {
  69. complete(oneObject);
  70. }
  71. }];
  72. }
  73. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete
  74. {
  75. [self getTable_async:tableName predicate:predicate sortDescriptors:nil complete:complete];
  76. }
  77. + (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete
  78. {
  79. [self asyncQueue:true actions:^{
  80. NSArray *resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];
  81. if (complete) {
  82. complete(resultArr);
  83. }
  84. }];
  85. }
  86. + (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete
  87. {
  88. [self asyncQueue:true actions:^{
  89. NSArray *resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];
  90. if (complete) {
  91. complete(resultArr);
  92. }
  93. }];
  94. }
  95. //同步执行任务
  96. + (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary  toTable:(NSString *)tableName
  97. {
  98. __block NSManagedObject *oneObject = nil;
  99. [self asyncQueue:false actions:^{
  100. oneObject = [self addObject:dictionary toTable:tableName];
  101. [self save:^(NSError *error) { error?oneObject=nil:nil; }];
  102. }];
  103. return oneObject;
  104. }
  105. + (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName
  106. {
  107. __block NSArray *resultArr = nil;
  108. [self asyncQueue:false actions:^{
  109. resultArr = [self addObjectsFromArray:otherArray toTable:tableName];
  110. [self save:^(NSError *error) { error?resultArr=@[]:nil; }];
  111. }];
  112. return resultArr;
  113. }
  114. + (BOOL)deleteObjects_sync:(NSArray *)manyObject
  115. {
  116. __block BOOL success = true;
  117. [self asyncQueue:false actions:^{
  118. [self deleteObjects:manyObject];
  119. [self save:^(NSError *error) { error?success=false:true; }];
  120. }];
  121. return success;
  122. }
  123. + (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params
  124. {
  125. __block NSArray *resultArray = nil;
  126. [self asyncQueue:false actions:^{
  127. resultArray = [self updateTable:tableName predicate:predicate params:params];
  128. [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
  129. }];
  130. return resultArray;
  131. }
  132. + (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params
  133. {
  134. __block NSManagedObject *oneObject = nil;
  135. [self asyncQueue:false actions:^{
  136. oneObject = [self updateObject:object params:params];
  137. [self save:^(NSError *error) { error?oneObject=nil:nil; }];
  138. }];
  139. return oneObject;
  140. }
  141. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate
  142. {
  143. return [self getTable_sync:tableName predicate:predicate sortDescriptors:nil];
  144. }
  145. + (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions
  146. {
  147. __block NSArray *resultArr = nil;
  148. [self asyncQueue:false actions:^{
  149. resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];
  150. }];
  151. return resultArr;
  152. }
  153. + (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors
  154. {
  155. __block NSArray *resultArr = nil;
  156. [self asyncQueue:false actions:^{
  157. resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];
  158. }];
  159. return resultArr;
  160. }
  161. //扩展方法
  162. + (NSString *)upHeadString:(NSString *)string
  163. {
  164. return [[[string substringToIndex:1] uppercaseString] stringByAppendingString:[string substringFromIndex:1]];
  165. }
  166. - (void)setContentDictionary:(NSDictionary *)dictionary
  167. {
  168. for (NSString *key in [dictionary allKeys])
  169. {
  170. id value = [dictionary objectForKey:key];
  171. if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){
  172. @try {
  173. [self setValue:value forKey:key];
  174. }
  175. @catch (NSException *exception) {
  176. NSLog(@"解析基本类型出错了-->%@",exception);
  177. }
  178. }else if ([value isKindOfClass:[NSDictionary class]]){
  179. @try {
  180. NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];
  181. NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];
  182. NSString *tableName = relationshipDescrip.destinationEntity.name;
  183. NSManagedObject *object = [NSManagedObject addObject:value toTable:tableName];
  184. [self setValue:object forKey:key];
  185. }
  186. @catch (NSException *exception) {
  187. NSLog(@"解析字典出错了-->%@",exception);
  188. }
  189. }else if ([value isKindOfClass:[NSArray class]]){
  190. @try {
  191. for (NSDictionary *oneJsonObject in value)
  192. {
  193. NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];
  194. NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];
  195. NSString *tableName = relationshipDescrip.destinationEntity.name;
  196. NSManagedObject *object = [NSManagedObject addObject:oneJsonObject toTable:tableName];
  197. SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);
  198. SuppressPerformSelectorLeakWarning([self performSelector:addSelector withObject:object]);
  199. }
  200. }
  201. @catch (NSException *exception) {
  202. NSLog(@"解析数组出错了-->%@",exception);
  203. }
  204. }
  205. }
  206. }
  207. //在当前队列执行任务
  208. + (NSManagedObject *)addObject:(NSDictionary *)dictionary toTable:(NSString *)tableName
  209. {
  210. NSManagedObject *oneObject = nil;
  211. Class class = NSClassFromString(tableName);
  212. NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];
  213. oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];
  214. [oneObject setContentDictionary:dictionary];
  215. return oneObject;
  216. }
  217. + (NSArray *)addObjectsFromArray:(NSArray *)otherArray toTable:(NSString *)tableName
  218. {
  219. NSMutableArray *resultArray = [[NSMutableArray alloc] init];
  220. Class class = NSClassFromString(tableName);
  221. NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];
  222. for (NSDictionary *dictionary in otherArray)
  223. {
  224. NSManagedObject *oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];
  225. [oneObject setContentDictionary:dictionary];
  226. [resultArray addObject:oneObject];
  227. }
  228. return [resultArray copy];
  229. }
  230. + (NSArray *)updateTable:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params
  231. {
  232. //查询数据
  233. NSArray *queryArr = [self getTable:tableName predicate:predicate sortDescriptors:nil actions:nil];
  234. //有匹配的记录时则更新记录
  235. if(queryArr && queryArr.count){
  236. for (NSManagedObject *object in queryArr.copy)
  237. {
  238. [self updateObject:object params:params];
  239. }
  240. } else //没有匹配的记录时添加记录
  241. {
  242. queryArr = @[[self addObject:params toTable:tableName]];
  243. }
  244. return queryArr;
  245. }
  246. + (NSManagedObject *)updateObject:(NSManagedObject *)object params:(NSDictionary *)params
  247. {
  248. for (NSString *key in params.allKeys)
  249. {
  250. id value = [params objectForKey:key];
  251. if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){
  252. @try {
  253. [object setValue:value forKey:key];
  254. }
  255. @catch (NSException *exception) {
  256. NSLog(@"key值出错了-->%@",exception);
  257. }
  258. }else if ([value isKindOfClass:[NSDictionary class]]){
  259. @try {
  260. NSManagedObject *otherObject = [object valueForKey:key];
  261. if(otherObject){
  262. [self updateObject:otherObject params:value];
  263. }else{
  264. NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class])
  265. inManagedObjectContext:globalManagedObjectContext_util];
  266. NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];
  267. NSString *tableName = relationshipDescrip.destinationEntity.name;
  268. otherObject = [NSManagedObject addObject:value toTable:tableName];
  269. [object setValue:otherObject forKey:key];
  270. }
  271. }
  272. @catch (NSException *exception) {
  273. NSLog(@"解析字典出错了-->%@",exception);
  274. }
  275. }else if ([value isKindOfClass:[NSArray class]]){
  276. @try {
  277. NSArray *objectArray = [[object valueForKey:key] allObjects];
  278. for (int index=0; index<[(NSArray *)value count]; index++)
  279. {
  280. NSDictionary *tempParams = [(NSArray *)value objectAtIndex:index];
  281. if (objectArray && index<objectArray.count) {
  282. [self updateObject:objectArray[index] params:tempParams];
  283. }else{
  284. NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([object class])
  285. inManagedObjectContext:globalManagedObjectContext_util];
  286. NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];
  287. NSString *tableName = relationshipDescrip.destinationEntity.name;
  288. NSManagedObject *tempObject = [self addObject:tempParams toTable:tableName];
  289. SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);
  290. SuppressPerformSelectorLeakWarning([object performSelector:addSelector withObject:tempObject]);
  291. }
  292. }
  293. }
  294. @catch (NSException *exception) {
  295. NSLog(@"解析数组出错了-->%@",exception);
  296. }
  297. }
  298. }
  299. return object;
  300. }
  301. + (NSArray *)getTable:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors actions:(void (^)(NSFetchRequest *request))actions
  302. {
  303. NSArray *resultArr = @[];
  304. NSFetchRequest *request = [[NSFetchRequest alloc]init];
  305. NSEntityDescription *description = [NSEntityDescription entityForName:tableName inManagedObjectContext:globalManagedObjectContext_util];
  306. [request setEntity:description];
  307. if (predicate) {
  308. [request setPredicate:predicate];
  309. }
  310. if (sortDescriptors && sortDescriptors.count) {
  311. [request setSortDescriptors:sortDescriptors];
  312. }
  313. actions?actions(request):nil;
  314. @try {
  315. @synchronized(globalManagedObjectContext_util) {
  316. resultArr = [globalManagedObjectContext_util executeFetchRequest:request error:nil];
  317. }
  318. }
  319. @catch (NSException *exception) {
  320. NSLog(@"查询数据库出错了-->%@",exception);
  321. }
  322. return resultArr;
  323. }
  324. + (void)save:(void (^)(NSError *error))complete
  325. {
  326. NSError *error;
  327. @synchronized(globalManagedObjectContext_util) {
  328. if (![globalManagedObjectContext_util save:&error]) {
  329. // Update to handle the error appropriately.
  330. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  331. }
  332. }
  333. }
  334. + (void)deleteObjects:(NSArray *)manyObject
  335. {
  336. @synchronized(globalManagedObjectContext_util) {
  337. for (NSManagedObject *object in manyObject){
  338. [globalManagedObjectContext_util deleteObject:object];
  339. }
  340. }
  341. }
  342. //是否在异步队列中操作数据库
  343. + (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions
  344. {
  345. static int specificKey;
  346. if (myCustomQueue == NULL)
  347. {
  348. myCustomQueue = dispatch_queue_create("com.jizhi.coredata", DISPATCH_QUEUE_SERIAL); //生成一个串行队列
  349. CFStringRef specificValue = CFSTR("com.jizhi.coredata");
  350. dispatch_queue_set_specific(myCustomQueue, &specificKey, (void*)specificValue,(dispatch_function_t)CFRelease);
  351. }
  352. NSString *retrievedValue = (NSString *)CFBridgingRelease(dispatch_get_specific(&specificKey));
  353. if (retrievedValue && [retrievedValue isEqualToString:@"com.jizhi.coredata"]) {
  354. actions ? actions() : nil;
  355. }else{
  356. if(async){
  357. dispatch_async(myCustomQueue, ^{
  358. actions ? actions() : nil;
  359. });
  360. }else{
  361. dispatch_sync(myCustomQueue, ^{
  362. actions ? actions() : nil;
  363. });
  364. }
  365. }
  366. }
  367. @end

CoreData 基本操作方法封装的更多相关文章

  1. python数据操作方法封装

    工作中经常会用到数据的插叙.单条数据插入和批量数据插入,以下是本人封装的一个类,推荐给各位: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author ...

  2. selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装

    学习目的: 掌握自动化框架中需要的一些基础web操作 正式步骤: 使用title_contains检查页面是否正确 # -*- coding:utf-8 -*- import time from se ...

  3. CoreData

    之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难. 由此出现CoreData框架,将sql的操作转换成为对 ...

  4. 使用开源库MagicalRecord操作CoreData

      1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...

  5. 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)

    前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...

  6. 使用开源库 MagicalRecord 操作 CoreData

    MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data ...

  7. CoreData / MagicalRecord

    CoreData 之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难.由此出现CoreData框架,将sql ...

  8. iOS CoreData 介绍和使用(以及一些注意事项)

    iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...

  9. iOS CoreData介绍和使用(以及一些注意事项)

    iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...

随机推荐

  1. fedora下缺少autopoint包的解决办法

    编译过程中,报错,缺少autopoint包 然而无论是yum install autopoint 还是yum search autopoint都没有理想的答案 执行yum install gettex ...

  2. java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)

    创建线程的第二中方式: /** *      步骤: 1定义类实现Runnable接口      2.实现Runnable接口中的run方法.      3.通过Thread类建立线程对象,并将Run ...

  3. 李洪强iOS开发之让您的Xcode键字如飞

    手指在键盘上飞速跳跃,终端上的代码也随着飞舞,是的这确实很酷.优秀的程序员总是这么一群人,他们不拘于现状,不固步自封,他们喜欢新奇的事,他们把自己发挥到极致. 指法攻略 放下您钟爱的鼠标吧,在前行之中 ...

  4. 李洪强iOS之Foundation框架—字符串

    Foundation框架—字符串 一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:O ...

  5. Intellij IDEA调试功能

    public class Demo { public static void f1() { System.out.println("one"); System.out.printl ...

  6. 使用Retrofit时出现 java.lang.IllegalArgumentException: URL query string "t={type}&p={page}&size={count}" must not have replace block. For dynamic query parameters use @Query.异常原因

    /** * Created by leo on 16/4/30. */ public interface GanchaiService { @GET("digest?t={type}& ...

  7. org.json和json-lib比较

    经常会用到JSON格式才处理,尤其是在Http请求的时候,网上可以找到很多json处理的相关工具,如org.json和json-lib,下面两段源代码是分别使用这两个工具解析和构造JSON的演示程序. ...

  8. Mysql:常用代码

    C/S: Client Server B/S: Brower Server Php主要实现B/S .net IIS Jave TomCat LAMP:L Mysql:常用代码 Create table ...

  9. Linux线程属性总结

    线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. //线程属性结构如下: typedef struct { int                   etachs ...

  10. json格式的字符串转为json对象遇到特殊字符问题解决

    中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...