CoreData 基本操作方法封装

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

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


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

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

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


3个类文件分别如下:


//  CoreDataUtil.h

//
//  CoreDataUtil.h
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NSManagedObject+Explain.h"
#import "NSManagedObject+Magic.h"

@interface CoreDataUtil : NSObject

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

+ (void)launch;

@end

//  CoreDataUtil.m

//
//  CoreDataUtil.m
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import "CoreDataUtil.h"

NSManagedObjectContext *globalManagedObjectContext_util;
NSManagedObjectModel *globalManagedObjectModel_util;

@implementation CoreDataUtil
@synthesize managedObjectContext_util = _managedObjectContext_util;
@synthesize managedObjectModel_util = _managedObjectModel_util;
@synthesize persistentStoreCoordinator_util = _persistentStoreCoordinator_util;

+ (void)launch
{
    static dispatch_once_t pred = 0;
	__strong static id coreDataUtil = nil;
	dispatch_once(&pred, ^{
	    coreDataUtil = [[self alloc] init];
	});
}

- (id)init
{
    self = [super init];
    if (self) {
        //初始化模型
        [NSManagedObject asyncQueue:false actions:^{
            globalManagedObjectContext_util = [self managedObjectContext];
            globalManagedObjectModel_util = [self managedObjectModel];
        }];
    }
    return self;
}

#pragma mark - Core Data stack

// Returns the managed object context for the application.
- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext_util != nil) {
        return _managedObjectContext_util;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext_util = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext_util setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext_util;
}

// Returns the managed object model for the application.
- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel_util != nil) {
        return _managedObjectModel_util;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"models" withExtension:@"momd"];
    _managedObjectModel_util = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel_util;
}

// Returns the persistent store coordinator for the application.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
	if (_persistentStoreCoordinator_util != nil) {
		return _persistentStoreCoordinator_util;
	}
    
	NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"models.sqlite"];
	NSError *error = nil;
	NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
	                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
	                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
	                         //[NSNumber numberWithBool:YES], NSIgnorePersistentStoreVersioningOption,
	                         nil];
	_persistentStoreCoordinator_util = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
	if (![_persistentStoreCoordinator_util addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
		NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        
		// reset models data when core data change
        [userDefaults removeObjectForKey:@"AllAuthData"];
        [userDefaults synchronize];
		[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
		_persistentStoreCoordinator_util = nil;
		return [self persistentStoreCoordinator];
	}
    
	return _persistentStoreCoordinator_util;
}


#pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

@end


//  NSManagedObject+Explain.h

//
//  NSManagedObject+Explain.h
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import <CoreData/CoreData.h>

@interface NSManagedObject (Explain)

//异步执行任务
+ (void)addObject_async:(NSDictionary *)dictionary toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete;
+ (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete;
+ (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete;
+ (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete;
+ (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete;
+ (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete;
+ (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete;
+ (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete;

//同步执行任务
+ (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary toTable:(NSString *)tableName;
+ (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName;
+ (BOOL)deleteObjects_sync:(NSArray *)manyObject;
+ (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params;
+ (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params;
+ (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate;
+ (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions;
+ (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors;

//是否在异步队列中操作数据库
+ (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions;

@end


//  NSManagedObject+Explain.m

//
//  NSManagedObject+Explain.m
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import "NSManagedObject+Explain.h"
#import "CoreDataUtil.h"

#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)

static dispatch_queue_t myCustomQueue;

extern NSManagedObjectContext *globalManagedObjectContext_util;
extern NSManagedObjectModel *globalManagedObjectModel_util;

@implementation NSManagedObject (Explain)

//异步执行任务
+ (void)addObject_async:(NSDictionary *)dictionary  toTable:(NSString *)tableName complete:(void (^)(NSManagedObject *object))complete
{
    [self asyncQueue:true actions:^{
        __block NSManagedObject *oneObject = [self addObject:dictionary toTable:tableName];
        [self save:^(NSError *error) { error?oneObject=nil:nil; }];
        if (complete) {
            complete(oneObject);
        }
    }];
}
+ (void)addObjectsFromArray_async:(NSArray *)otherArray  toTable:(NSString *)tableName complete:(void (^)(NSArray *resultArray))complete
{
    [self asyncQueue:true actions:^{
        __block NSArray *resultArray = [self addObjectsFromArray:otherArray toTable:tableName];
        [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
        if (complete) {
            complete(resultArray);
        }
    }];
}
+ (void)deleteObjects_async:(NSArray *)manyObject complete:(void (^)(BOOL success))complete
{
    [self asyncQueue:true actions:^{
        [self deleteObjects:manyObject];
        __block BOOL success = true;
        [self save:^(NSError *error) { error?success=false:true; }];
        if (complete) {
            complete(success);
        }
    }];
}
+ (void)updateTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params complete:(void (^)(NSArray *resultArray))complete
{
    [self asyncQueue:true actions:^{
        __block NSArray *resultArray = [self updateTable:tableName predicate:predicate params:params];
        [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
        if (complete) {
            complete(resultArray);
        }
    }];
}
+ (void)updateObject_async:(NSManagedObject *)object params:(NSDictionary *)params complete:(void (^)(NSManagedObject *object))complete
{
    [self asyncQueue:true actions:^{
        __block NSManagedObject *oneObject = [self updateObject:object params:params];
        [self save:^(NSError *error) { error?oneObject=nil:nil; }];
        if (complete) {
            complete(oneObject);
        }
    }];
}
+ (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate complete:(void (^)(NSArray *result))complete
{
    [self getTable_async:tableName predicate:predicate sortDescriptors:nil complete:complete];
}
+ (void)getTable_async:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions complete:(void (^)(NSArray *result))complete
{
    [self asyncQueue:true actions:^{
        NSArray *resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];
        if (complete) {
            complete(resultArr);
        }
    }];
}
+ (void)getTable_async:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors complete:(void (^)(NSArray *result))complete
{
    [self asyncQueue:true actions:^{
        NSArray *resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];
        if (complete) {
            complete(resultArr);
        }
    }];
}

//同步执行任务
+ (NSManagedObject *)addObject_sync:(NSDictionary *)dictionary  toTable:(NSString *)tableName
{
    __block NSManagedObject *oneObject = nil;
    [self asyncQueue:false actions:^{
        oneObject = [self addObject:dictionary toTable:tableName];
        [self save:^(NSError *error) { error?oneObject=nil:nil; }];
    }];
    return oneObject;
}
+ (NSArray *)addObjectsFromArray_sync:(NSArray *)otherArray  toTable:(NSString *)tableName
{
    __block NSArray *resultArr = nil;
    [self asyncQueue:false actions:^{
        resultArr = [self addObjectsFromArray:otherArray toTable:tableName];
        [self save:^(NSError *error) { error?resultArr=@[]:nil; }];
    }];
    return resultArr;
}
+ (BOOL)deleteObjects_sync:(NSArray *)manyObject
{
    __block BOOL success = true;
    [self asyncQueue:false actions:^{
        [self deleteObjects:manyObject];
        [self save:^(NSError *error) { error?success=false:true; }];
    }];
    return success;
}
+ (NSArray *)updateTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params
{
    __block NSArray *resultArray = nil;
    [self asyncQueue:false actions:^{
        resultArray = [self updateTable:tableName predicate:predicate params:params];
        [self save:^(NSError *error) { error?resultArray=@[]:nil; }];
    }];
    return resultArray;
}
+ (NSManagedObject *)updateObject_sync:(NSManagedObject *)object params:(NSDictionary *)params
{
    __block NSManagedObject *oneObject = nil;
    [self asyncQueue:false actions:^{
        oneObject = [self updateObject:object params:params];
        [self save:^(NSError *error) { error?oneObject=nil:nil; }];
    }];
    return oneObject;
}
+ (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate
{
    return [self getTable_sync:tableName predicate:predicate sortDescriptors:nil];
}
+ (NSArray *)getTable_sync:(NSString *)tableName actions:(void (^)(NSFetchRequest *request))actions
{
    __block NSArray *resultArr = nil;
    [self asyncQueue:false actions:^{
        resultArr = [self getTable:tableName predicate:nil sortDescriptors:nil actions:actions];
    }];
    return resultArr;
}
+ (NSArray *)getTable_sync:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors
{
    __block NSArray *resultArr = nil;
    [self asyncQueue:false actions:^{
        resultArr = [self getTable:tableName predicate:predicate sortDescriptors:sortDescriptors actions:nil];
    }];
    return resultArr;
}

//扩展方法
+ (NSString *)upHeadString:(NSString *)string
{
    return [[[string substringToIndex:1] uppercaseString] stringByAppendingString:[string substringFromIndex:1]];
}
- (void)setContentDictionary:(NSDictionary *)dictionary
{
    for (NSString *key in [dictionary allKeys])
    {
        id value = [dictionary objectForKey:key];
        
        if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){
            @try {
                [self setValue:value forKey:key];
            }
            @catch (NSException *exception) {
                NSLog(@"解析基本类型出错了-->%@",exception);
            }
            
        }else if ([value isKindOfClass:[NSDictionary class]]){
            @try {
                NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];
                NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];
                NSString *tableName = relationshipDescrip.destinationEntity.name;
                
                NSManagedObject *object = [NSManagedObject addObject:value toTable:tableName];
                
                [self setValue:object forKey:key];
            }
            @catch (NSException *exception) {
                NSLog(@"解析字典出错了-->%@",exception);
            }
        }else if ([value isKindOfClass:[NSArray class]]){
            
            @try {
                for (NSDictionary *oneJsonObject in value)
                {
                    NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class]) inManagedObjectContext:globalManagedObjectContext_util];
                    NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];
                    NSString *tableName = relationshipDescrip.destinationEntity.name;
                    
                    NSManagedObject *object = [NSManagedObject addObject:oneJsonObject toTable:tableName];
                    SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);
                    SuppressPerformSelectorLeakWarning([self performSelector:addSelector withObject:object]);
                }
            }
            @catch (NSException *exception) {
                NSLog(@"解析数组出错了-->%@",exception);
            }
        }
    }
}

//在当前队列执行任务
+ (NSManagedObject *)addObject:(NSDictionary *)dictionary toTable:(NSString *)tableName
{
    NSManagedObject *oneObject = nil;
    Class class = NSClassFromString(tableName);
    
    NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];
    oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];
    [oneObject setContentDictionary:dictionary];
    
    return oneObject;
}

+ (NSArray *)addObjectsFromArray:(NSArray *)otherArray toTable:(NSString *)tableName
{
    NSMutableArray *resultArray = [[NSMutableArray alloc] init];
    
    Class class = NSClassFromString(tableName);
    NSEntityDescription *entityDescrip = [[globalManagedObjectModel_util entitiesByName] objectForKey:tableName];
    
    for (NSDictionary *dictionary in otherArray)
    {
        NSManagedObject *oneObject = [[class alloc] initWithEntity:entityDescrip insertIntoManagedObjectContext:globalManagedObjectContext_util];
        [oneObject setContentDictionary:dictionary];
        [resultArray addObject:oneObject];
    }
    return [resultArray copy];
}

+ (NSArray *)updateTable:(NSString *)tableName predicate:(NSPredicate *)predicate params:(NSDictionary *)params
{
    //查询数据
    NSArray *queryArr = [self getTable:tableName predicate:predicate sortDescriptors:nil actions:nil];
    
    //有匹配的记录时则更新记录
    if(queryArr && queryArr.count){
        for (NSManagedObject *object in queryArr.copy)
        {
            [self updateObject:object params:params];
        }
    } else //没有匹配的记录时添加记录
    {
        queryArr = @[[self addObject:params toTable:tableName]];
    }
    return queryArr;
}

+ (NSManagedObject *)updateObject:(NSManagedObject *)object params:(NSDictionary *)params
{
    for (NSString *key in params.allKeys)
    {
        id value = [params objectForKey:key];
        
        if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSDate class]]){
            @try {
                [object setValue:value forKey:key];
            }
            @catch (NSException *exception) {
                NSLog(@"key值出错了-->%@",exception);
            }
        }else if ([value isKindOfClass:[NSDictionary class]]){
            @try {
                NSManagedObject *otherObject = [object valueForKey:key];
                if(otherObject){
                    [self updateObject:otherObject params:value];
                }else{
                    NSEntityDescription *entityDescirp = [NSEntityDescription entityForName:NSStringFromClass([self class])
                                                                     inManagedObjectContext:globalManagedObjectContext_util];
                    NSRelationshipDescription *relationshipDescrip = [entityDescirp.relationshipsByName objectForKey:key];
                    NSString *tableName = relationshipDescrip.destinationEntity.name;
                    
                    otherObject = [NSManagedObject addObject:value toTable:tableName];
                    [object setValue:otherObject forKey:key];
                }
            }
            @catch (NSException *exception) {
                NSLog(@"解析字典出错了-->%@",exception);
            }
        }else if ([value isKindOfClass:[NSArray class]]){
            @try {
                NSArray *objectArray = [[object valueForKey:key] allObjects];
                
                for (int index=0; index<[(NSArray *)value count]; index++)
                {
                    NSDictionary *tempParams = [(NSArray *)value objectAtIndex:index];
                    if (objectArray && index<objectArray.count) {
                        [self updateObject:objectArray[index] params:tempParams];
                    }else{
                        NSEntityDescription *entiDescirp = [NSEntityDescription entityForName:NSStringFromClass([object class])
                                                                       inManagedObjectContext:globalManagedObjectContext_util];
                        NSRelationshipDescription *relationshipDescrip = [entiDescirp.relationshipsByName objectForKey:key];
                        NSString *tableName = relationshipDescrip.destinationEntity.name;
                        
                        NSManagedObject *tempObject = [self addObject:tempParams toTable:tableName];
                        SEL addSelector = NSSelectorFromString([NSString stringWithFormat:@"add%@Object:",[NSManagedObject upHeadString:key]]);
                        SuppressPerformSelectorLeakWarning([object performSelector:addSelector withObject:tempObject]);
                    }
                }
            }
            @catch (NSException *exception) {
                NSLog(@"解析数组出错了-->%@",exception);
            }
        }
    }
    return object;
}

+ (NSArray *)getTable:(NSString *)tableName predicate:(NSPredicate *)predicate sortDescriptors:(NSArray *)sortDescriptors actions:(void (^)(NSFetchRequest *request))actions
{
    NSArray *resultArr = @[];
    
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *description = [NSEntityDescription entityForName:tableName inManagedObjectContext:globalManagedObjectContext_util];
    [request setEntity:description];
    if (predicate) {
        [request setPredicate:predicate];
    }
    if (sortDescriptors && sortDescriptors.count) {
        [request setSortDescriptors:sortDescriptors];
    }
    actions?actions(request):nil;
    @try {
        @synchronized(globalManagedObjectContext_util) {
            resultArr = [globalManagedObjectContext_util executeFetchRequest:request error:nil];
        }
    }
    @catch (NSException *exception) {
        NSLog(@"查询数据库出错了-->%@",exception);
    }
    
    return resultArr;
}

+ (void)save:(void (^)(NSError *error))complete
{
    NSError *error;
    @synchronized(globalManagedObjectContext_util) {
        if (![globalManagedObjectContext_util save:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
    }
}

+ (void)deleteObjects:(NSArray *)manyObject
{
    @synchronized(globalManagedObjectContext_util) {
        for (NSManagedObject *object in manyObject){
            [globalManagedObjectContext_util deleteObject:object];
        }
    }
}

//是否在异步队列中操作数据库
+ (void)asyncQueue:(BOOL)async actions:(void (^)(void))actions
{
    static int specificKey;
    if (myCustomQueue == NULL)
    {
        myCustomQueue = dispatch_queue_create("com.jizhi.coredata", DISPATCH_QUEUE_SERIAL); //生成一个串行队列
        
        CFStringRef specificValue = CFSTR("com.jizhi.coredata");
        dispatch_queue_set_specific(myCustomQueue, &specificKey, (void*)specificValue,(dispatch_function_t)CFRelease);
    }
    
    NSString *retrievedValue = (NSString *)CFBridgingRelease(dispatch_get_specific(&specificKey));
    if (retrievedValue && [retrievedValue isEqualToString:@"com.jizhi.coredata"]) {
        actions ? actions() : nil;
    }else{
        if(async){
            dispatch_async(myCustomQueue, ^{
                actions ? actions() : nil;
            });
        }else{
            dispatch_sync(myCustomQueue, ^{
                actions ? actions() : nil;
            });
        }
    }
}

@end



//  NSManagedObject+Magic.h

//
//  NSManagedObject+Magic.h
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import <CoreData/CoreData.h>

/*导入所有通过model生成的SubClass*/
#import "User.h"
#import "Bank.h"

@interface NSSet (TCNSManagedObjectMethods)
// 排序下
- (NSArray *)sortObjects;
@end

@interface NSManagedObject (Magic)

/*获取表中所有数据*/
+ (NSArray *)getTable:(NSString *)tableName;
/*清空表*/
+ (void)cleanTable:(NSString *)tableName;

@end

//  NSManagedObject+Magic.m

//
//  NSManagedObject+Magic.m
//  CoreDataUtil
//
//  Created by marujun on 14-1-13.
//  Copyright (c) 2014年 jizhi. All rights reserved.
//

#import "NSManagedObject+Magic.h"
#import "CoreDataUtil.h"

@implementation NSSet (TCNSManagedObjectMethods)
- (NSArray *)sortObjects
{
    return [[self allObjects] sortedArrayUsingComparator:^NSComparisonResult(NSManagedObject *obj1, NSManagedObject *obj2) {
        if (obj1.index.intValue > obj2.index.intValue) {
            return (NSComparisonResult)NSOrderedDescending;
        }else if (obj1.index.intValue < obj2.index.intValue){
            return NSOrderedAscending;
        }
        return NSOrderedSame;
    }];
}
@end

extern NSManagedObjectContext *globalManagedObjectContext;
extern NSManagedObjectModel *globalManagedObjectModel;

@implementation NSManagedObject (Magic)

+ (NSArray *)getTable:(NSString *)tableName
{
    NSArray *resultArr = [NSManagedObject getTable_sync:tableName predicate:nil];
    return (resultArr && resultArr.count != 0)?resultArr:nil;
}

+ (void)cleanTable:(NSString *)tableName
{
    NSArray *array = [self getTable_sync:tableName predicate:nil];
    [self deleteObject_sync:array];
}

@end

GitHub 地址: https://github.com/marujun/DataManager


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值