CoreData的使用

作者: 宁小缺 | 来源:发表于2016-06-13 17:07 被阅读307次

    之前看关于CoreData的使用都w是很早之前的,对于现在有些不太适用,在网上各种查找和总结之后,写了这篇文章,有兴趣的朋友可以看看。

    1.创建工程的时候选择CoreData(不建议)

    CoreData

    创建工程的是选择了CoreData,创建完工程之后,系统会自动生成该文件



    你也可以通过添加文件达到同样的效果



    选中文件,往里面添加你想要添加的模型,并对属性进行设置
    (ps:Entity首字母必须大写,属性类型也需要规范设置)

    创建实体模型



    每个模型对应四个文件

    2.创建你的Manager类-继承自NSObject

    .h文件
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
    
    @interface MyCoreManager : NSObject
    
    /**管理对象, 上下文, 持久性存储模型对象*/
    @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
    
    /**单例*/
    + (instancetype)shareInstanceWithStoreName:(NSString *)storeName;
    
    /** 查找 数据*/
    - (NSMutableArray *)findByModel:(id)model predicateString: (NSString *)predicateString;
    
    /** 插入 数据 */
    - (BOOL)insertModel:(id)model;
    
    /** 删除 数据 */
    - (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString;
    
    /** 修改 数据 */
    - (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString;
    @end
    
    
    .m文件
    #import "MyCoreManager.h"
    #import <CoreData/CoreData.h>
    #import <objc/runtime.h>
    
    #define Class_NAME(CName) NSStringFromClass([CName class])
    
    @interface MyCoreManager ()
    /**被管理的数据模型, 数据结构*/
    @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
    
    /**连接数据库的*/
    @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    /**数据库名*/
    @property (nonatomic, strong) NSString *storeName;
    
    @end
    static MyCoreManager *coreData;
    
    @implementation MyCoreManager
    
    - (NSManagedObjectContext *)managedObjectContext
    {
        if (!_managedObjectContext) {
            
            NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
            
            if (coordinator) {
                _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
                [_managedObjectContext setPersistentStoreCoordinator:coordinator];
            }
        }
        return _managedObjectContext;
    }
    
    
    //  managedObjectModel 懒加载
    - (NSManagedObjectModel *)managedObjectModel
    {
        if (!_managedObjectModel) {
            
            NSURL *modelURL = [[NSBundle mainBundle] URLForResource:_storeName withExtension:@"momd"];
            _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
        }
        return _managedObjectModel;
    }
    
    
    //  persistentStoreCoordinator 懒加载
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
        if (!_persistentStoreCoordinator) {
            
            NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", _storeName]];
            NSLog(@"---\nstoreURL: %@",storeURL);
            NSError *error = nil;
            _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
            
            if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
                abort();
            }
        }
        return _persistentStoreCoordinator;
    }
    
    
    // Returns the URL to the application's Documents directory.获取Documents路径
    - (NSURL *)applicationDocumentsDirectory
    {
        return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    }
    
    
    #pragma mark - Methods
    
    //  查
    - (NSArray *)findByModel:(id)model predicateString: (NSString *)predicateString
    {
        NSError *error = nil;
        NSArray *listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
        
        NSMutableArray *resultArray = [[NSMutableArray alloc] initWithArray:listArray];;
        //
        //    if (listArray.count >= 1)
        //    {
        //
        //        for (NSManagedObject *manager in listArray)
        //        {
        //
        //            for (NSString *propertyName in [self ClassAttributes:model] )
        //            {
        //                [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
        //            }
        //            [resultArray addObject:model];
        //        }
        //    }
        return resultArray;
    }
    
    
    //  插入 数据
    - (BOOL)insertModel:(id)model
    {
        NSManagedObject *manager = [NSEntityDescription insertNewObjectForEntityForName:Class_NAME(model) inManagedObjectContext:_managedObjectContext];
        
        for (NSString *propertyName in [self ClassAttributes:model]) {
            [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
        }
        
        BOOL result = [self saveContext];
        return result;
        
        
    }
    
    
    //  删除 数据
    - (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
    {
        NSError * error = nil;
        NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
        
        if (listArray.count > 0) {
            for (NSManagedObject *manager in listArray) {
                
                [_managedObjectContext deleteObject:manager];
            }
        }
        return [self saveContext];
    }
    
    
    //  改
    - (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString
    {
        NSError * error = nil;
        NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
        
        if (listArray.count > 0) {
            
            for (NSManagedObject * manager in listArray) {
                for (NSString * propertyName in [self ClassAttributes:model]) {
                    [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
                }
            }
        }
        return [self saveContext];
    }
    
    
    //  读取数据请求 ( 连接 请求 )
    - (NSFetchRequest *)fetchRequest:(NSString *)entityName predicate:(NSString *)predicateString
    {
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:_managedObjectContext]];
        
        if (predicateString != nil) {
            
            NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
            
            [request setPredicate:predicate];
        }
        return request;
    }
    
    
    #pragma mark - allAttributes
    - (NSMutableArray *)ClassAttributes:(id)classModel
    {
        NSMutableArray *array = [NSMutableArray array];
        NSString *className = Class_NAME(classModel);
        const char *cClassName = [className UTF8String];
        
        id classM = objc_getClass(cClassName);
        unsigned int outCount, i;
        objc_property_t * properties = class_copyPropertyList(classM, &outCount);
        for (i = 0; i < outCount; i++) {
            objc_property_t property = properties[i];
            NSString * attributeName = [NSString stringWithUTF8String:property_getName(property)];
            
            [array addObject:attributeName];
        }
        return array;
    }
    
    
    #pragma mark - save
    - (BOOL)saveContext
    {
        NSManagedObjectContext *context = [self managedObjectContext];
        
        if (context) {
            
            NSError *error = nil;
            if ([context hasChanges] && ![context save:&error]) {
                abort();
                return NO;
            }
        }
        return YES;
    }
    
    //  单例
    + (instancetype)shareInstanceWithStoreName:(NSString *)storeName
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            coreData = [[self alloc] init];
            coreData.storeName = storeName;
        });
        return coreData;
    }
    
    
    @end
    
    

    3.调用

    1.引入模型文件,和你创建的模型名字相同的那个
    2.引入你的管理类

    增
        MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
        Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
        stu.name = @"alex";
        stu.age = @"12";
        [coreData insertModel:stu];
    
    查
        MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
        Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
        
        NSMutableArray * StuArr = [coreData findByModel:stu predicateString:@"name = 12 AND age = 12"];
        
        for (Student * stuModel in StuArr) {
            MyModel * model = [[MyModel alloc]init];
            model.name = stuModel.name;
            model.age = stuModel.age;
            [_datas addObject: model];
        }
    
    
    //删
    - (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
    //改
    - (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString
    
    

    三点要注意:
    (1) shareInstanceWithStoreName:@"MyData"]中的MyData是你所创建的model文件名
    (2) 对象初始化不能简单的alloc init ,需要按上面代码的歌声进行初始化,否则调用对象就会导致程序崩溃
    (3)谓词(predicateString)的使用,不懂的同学可以戳这里http://www.jianshu.com/p/3da75e023b9c

    相关文章

      网友评论

      本文标题:CoreData的使用

      本文链接:https://www.haomeiwen.com/subject/impydttx.html