CoreData

一、属性的解释

/** 被管理对象的上下文 */
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
/** 被管理对象的模型 */
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
/** 持久化存储调度器 */
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

1. 被管理对象的上下文:“managedObjectContext”

  - 负责管理数据模型,一旦数据发生改变,调用上下文的“save”方法,可以通知调度器“persistentStoreCoordinator”,将当前内存中的对象图保存到SQLite数据库。

2. 被管理对象的模型:“managedObjectModel”

  - 在开始时,可以用图形界面维护的数据模型,可以包含多个数据实体,并且制定各个实体之间的关系。

3. 持久化存储调度器:“persistentStoreCoordinator”

  -  向上跟上下文“managedObjectContext” 打交道,向下跟SQLite打交道,传递的是数据。

如图:

二、方法的解释

1. saveContext方法的一些解释:

- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        
        // 1. 判断上下文是否发生变化 同时 上下文保存成功
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            
            // 2. 会直接终止应用程序,在开发时这个方法可以协助调试,不过在发布的时候,最好替换掉
            abort();
        }
    }
}

2. 一般保存的时候,用下面这个简化版即可。如果不需要捕获各种错误的话:

// 最简单的保存
- (void)saveContext1{
    [self.managedObjectContext save:NULL];
}

3.  "applicationDocumentsDirectory"方法的解释

/*
    application Documents Directory - 获取到文档目录的URL
 */
- (NSURL *)applicationDocumentsDirectory {
    
    // 1. 原先的取出路径字符串:
    // [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
    
    // 2. 取出路径对应的URL
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

4. “managedObjectModel” 方法的解释

/* 图形化界面,用于设计实体,并且指定实体关系
 * 可以包含多个实体
 */
- (NSManagedObjectModel *)managedObjectModel {
    
    // 1. 先判断是否为空,不为空直接返回,有点类似懒加载
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    
    // 2. 取出模型的URL,"momd"是app的包内容里面的“项目名文件在”中的文件后缀。所有的模型都加载出来。
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"coreDataSecond" withExtension:@"momd"];
    
    // 3. 实例化模型
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

5. “persistentStoreCoordinator”方法的解释

/* 持久化存储 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // 1. 实例化持久化存储调度器,使用图形界面创建的多个实体的模型,实例化存储调度器
    // 1.1 实例化之后,意味着调度器知道总共有多少个实体,以及实体之间的关系
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    
    // 2. 保存的URL,将SQLite数据库保存到沙盒文档目录下的"coreDataSecond.sqlite"
    // 2.1 指定SQLite保存的文件路径
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataSecond.sqlite"];
    
    // 官方代码
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}
/* 持久化存储 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // 1. 实例化持久化存储调度器,使用图形界面创建的多个实体的模型,实例化存储调度器
    // 1.1 实例化之后,意味着调度器知道总共有多少个实体,以及实体之间的关系
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    
    // 2. 保存的URL,将SQLite数据库保存到沙盒文档目录下的"coreDataSecond.sqlite"
    // 2.1 指定SQLite保存的文件路径
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataSecond.sqlite"];
    
    // 官方代码的简化版
    [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:NULL];
    
    return _persistentStoreCoordinator;
}

6.“managedObjectContext” 方法的解释

/* 被管理对象的上下文
 * 维护内存中所有实体的“对象图(Objects Graph)”
 */
- (NSManagedObjectContext *)managedObjectContext {
    
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    
    // 1. 实例化一个被管理对象的上下文
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    // 2. 设置持久化存储调度器
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

7. Core Data Stack(堆栈)

1. Core Data stack 是 Core Data 的核心,由一组Core Data 核心对象组成

  - NSManagedObjectModel  : 被管理对象模型

  - NSPersistentStoreCoordinator  :  负责将数据保存到磁盘

  - NSManagedObjectContext  :  负责管理模型对象的集合

原文地址:https://www.cnblogs.com/iOS363536404/p/5784528.html