CoreData简单使用流程分析

  1. 将工程中得所有实体类模型文件【Xxx.xcdatamodeld文件】读入内存,并使用一个NSManagedObjectModel单例对象在内存中保存.
//方式一、 读入工程中所有的实体类模型文件【以单例对象保存】

+ (instancetype)managedObjectModel {
    static NSManagedObjectModel *model = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //搜索工程中所有的.xcdatamodeld文件,并加载所有的实体到一个NSManagedObjectModel对象中
        model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]];
    });
    return model;
}

//方式二、 只读入某个名字的模型文件【同样以单例对象保存】

+ (instancetype)managedObjectModelWithName:(NSString *)modelName {
    static NSManagedObjectModel *model = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        /*初始化必须依赖.momd文件路径,而.momd文件由.xcdatamodeld文件编译而来*/
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
        model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    });

    return model;
}

  1. 利用实体类模型文件的对象NSManagedObjectModel对象,创建NSPersistentStoreCoordinator数据存储区域的单例对象
/**
 *  创建NSPersistentStoreCoordinator对象【单例保存】
 *
 *  @param isAuto    是否使用自动版本迁移
 *  @param storeType 数据文件在手机沙盒目录存放的格式
 *  @param fileURL   数据文件在手机沙盒目录存放的路径
 *
 */
+ (instancetype)createWithAutoMigration:(BOOL)isAuto
                              StoreType:(NSString *)storeType
                           StoreFileURL:(NSURL *)fileURL
{
    //1. 实体类模型文件读入内存对象保存
    NSManagedObjectModel *model = [NSManagedObjectModel managedObjectModel];

    //2. 传入实体类模型文件对象,创建PersistentStoreCoordinator存储区域对象
    NSPersistentStoreCoordinator * coordinator = nil;
    coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    //3. 指定在手机本地存放数据库的 位置、类型、配置
    NSDictionary *options = isAuto ? [self autoMigrationOptions] : nil;
    NSError *error = nil;
    [coordinator addPersistentStoreWithType:storeType
                              configuration:nil
                                        URL:fileURL
                                    options:options
                                      error:&error];

    if (error) {
        ErrorLog(error);
        abort();
    }

    if (!coordinator) {
        [NSException raise:@"NSPersistentCoordinator Create Failed With URL: %@ , Error Message: %@"
                    format:[fileURL absoluteString], [error localizedDescription]];
    }

    return coordinator;
}

  1. 使用数据存储区域对象NSPersistentCoordinator单例对象,创建NSManagedObjectContext对象,使用这个对象作为操作数据持久化Api的入口
//类型1、 主线程上得单例Context对象

+ (instancetype)foregroundContext {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _foregoundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        //默认设置一个版本自动迁移的存储器
        id persistentStoreCoordinator = [NSPersistentStoreCoordinator coordinatorUseAutoMigration];
        [_foregoundContext setPersistentStoreCoordinator:persistentStoreCoordinator];
    });
    return _foregoundContext;
}

//类型2、 后台子线程上得单例Context对象

+ (instancetype)backgroundContext {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        id context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
        [self setBackgroudContext:context];
        [_backgoundContext setParentContext:[self foregroundContext]];
    });
    return _backgoundContext;
}

//统一入口、 提供获取单例Context对象的入口函数,对不同线程提供不同的单例Context对象

+ (instancetype)managedObjectContext {
    if ([NSThread isMainThread]) {
        return [self foregroundContext];
    } else {
        return [self backgroundContext];
    }
}


  1. 最后,CoreData自动将实体类模型文件、已经实体类之间的关系,在手机沙盒目录Document目录创建数据库表,并设置表之间的关联关系。
    原文作者:xiongzenghui
    原文地址: https://segmentfault.com/a/1190000002960809
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞