• 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  :  负责管理模型对象的集合

  • 相关阅读:
    基础语法 -实验楼
    JavaSE案例-Bank
    初识Java
    Java学习大纲-0412更新
    增量法
    蛮力法
    Host‘116.77.33.xx’is not allowed to connect to this MySQL server
    Maven坐标
    HotSpot虚拟机对象创建
    程序计数器为什么是线程私有的?
  • 原文地址:https://www.cnblogs.com/iOS363536404/p/5784528.html
Copyright © 2020-2023  润新知