NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件;NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过 二、数据模型管理类NSManagedObjectModel 通过NSManagedObjectModel,可以将创建的数据模型文件读取为模型管理类对象,使用如下方法: //获取.xcdatamodeld * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl]; 其中还有一些属性和方法进行数据模型的管理: //将多个数据模型管理文件进行合并 + (nullable NSManagedObjectModel *)mergedModelFromBundles:(nullable NSArray<NSBundle *> *)bundles; //将多个数据模型管理类对象进行合并 + (nullable NSManagedObjectModel *)modelByMergingModels:(nullable NSArray<NSManagedObjectModel
使用该 URL 创建一个 NSManagedObjectModel 实例。 其中,在使用数据模型文件 URL 来创建 NSManagedObjectModel 实例的时候,Core Data 会将模型文件中的描述率先转换成对实体的程序式表达,然后再通过这些程序式表达创建 NSManagedObjectModel 现在我们就可以用这段代码,替换掉之前通过数据模型文件创建 NSManagedObjectModel 的操作。 Have you loaded your NSManagedObjectModel yet ? ,开发者可以在仅拥有 NSManagedObjectModel 实例的情况下,就具备了创建托管对象实例的条件。
二、建立数据对象类 前面博客介绍的NSManagedObjectModel是数据管理模型,可以将其类比如数据库,NSManagedObjectModel中存放着数据库的结构信息。 *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"]; //创建数据模型 NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl]; //创建持久化存储协调者 NSPersistentStoreCoordinator
, "categories": [{"id": 1, "name": "Core Data"]} NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; RKManagedObjectStore *managedObjectStore *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; RKManagedObjectStore *managedObjectStore NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; RKManagedObjectStore *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; RKManagedObjectStore *managedObjectStore
/** * 先把CoreData里面会用到的类总结一下: NSManagedObjectModel 数据模型管理类对应我们的.xcdatamodeld 文件 NSPersistentStoreCoordinator [[NSBundle mainBundle]URLForResource:@"CoreDataTest" withExtension:@"momd"]; // 获取创建的caredata 文件 NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelurl]; 上面是创建 NSManagedObjectModel
组成 一个最基本的 Core Data Stack 至少要由以下四个类的实例构成: •NSManagedObjectModel(托管对象模型)•NSManagedObjectContext(托管对象上下文 每个 Core Data Stack 都要有一个 NSManagedObjectModel(托管对象模型)实例,可以将其看作是实际数据模型的程序呈现。 数据模型编辑器将定义的结果保存成 XML 格式的文件,Xcode 会在编译项目时将该文件编译成尾缀为 momd 的二进制文件并放置在 Bundle 中,在创建 NSManagedObjectModel •实例化一个托管对象模型 要创建一个 NSManagedObjectModel 的实例,需要从应用程序包中加载数据模型文件。 class CoreDataStack { private static var _model: NSManagedObjectModel?
.png] [创建实体类.gif] [实体类的四个文件.png] 4、生成上下文 关联数据库 NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互 NSManagedObjectModel modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; //根据模型文件创建模型对象 NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //2、创建持久化存储助理:数据库 NSPersistentContainer是一个容器,封装了应用程序中的CoreData Stack(核心数据栈堆),简化了创建和管理的核心堆栈的数据处理创建NSManagedObjectModel,NSPersistentStoreCoordinator defaultDirectoryURL]; NSManagedObjectContext *viewContext = container.viewContext; NSManagedObjectModel
实体类的四个文件.png 4、生成上下文 关联数据库 NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互 NSManagedObjectModel modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; //根据模型文件创建模型对象 NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //2、创建持久化存储助理:数据库 NSPersistentContainer是一个容器,封装了应用程序中的CoreData Stack(核心数据栈堆),简化了创建和管理的核心堆栈的数据处理创建NSManagedObjectModel,NSPersistentStoreCoordinator defaultDirectoryURL]; NSManagedObjectContext *viewContext = container.viewContext; NSManagedObjectModel
abort(); } return __persistentStoreCoordinator; } 生成NSPersistentStoreCoordinator需要参数:文件保存路径、NSManagedObjectModel NSManagedObjectModel 生成这个类的来源就是在 xCode 里的.xcdatamodeld文件,我们可以可视化的对这个文件进行操作,实际上这个文件也就相当于数据库的 schema,这个文件编译后就是 Model Vesion:版本升级,Editor->Add Model Version,生成新的momd文件来进行版本升级,并且重新生成相关类 - (NSManagedObjectModel *)managedObjectModel NSBundle mainBundle] URLForResource:@"HelloApp" withExtension:@"momd"]; __managedObjectModel = [[NSManagedObjectModel
Data Stack iOS10中利用NSPersistentContainer iOS10之前涉及NSManagedObjectContext、NSPersistentStoreCoordinator、NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //2、创建持久化助理 //利用模型对象创建助理对象 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MoveBand" withExtension:@"momd"]; NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; NSAssert(mom ! Model"); // Create persistent store coordinator(创建NSPersistentStoreCoordinator对象(需要传入上述创建的NSManagedObjectModel
进行初始化操作 NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"]; NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl]; NSPersistentStoreCoordinator
它会把位于NSManagedObject Context里面的托管对象NSManagedObject类的实例或者某个NSManagedObject子类的实例,通过NSManagedObjectModel 凡是会引起NSManagedObjectModel托管对象模型变化的,都最好进行数据迁移,防止用户升级应用之后就闪退。 会引起NSManagedObjectModel托管对象模型变化的有以下几个操作,新增了一张表,新增了一张表里面的一个实体,新增一个实体的一个属性,把一个实体的某个属性迁移到另外一个实体的某个属性里面…… Error: Error Domain=NSCocoaErrorDomain Code=134140 "(null)" UserInfo={destinationModel=(<NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil
这个文件保存了用于创建数据模型(NSManagedObjectModel)的描述信息。 阅读 CoreData 探秘 - 从数据模型构建到托管对象实例[4] 一文,了解更多信息。 let schema = Schema([Item.self]) 开发者可以使用 Core Data 的新 API NSManagedObjectModel.makeManagedObjectModel ,通过为 SwiftData 声明的模型代码来生成对应的 NSManagedObjectModel: let model = NSManagedObjectModel.makeManagedObjectModel 这一点与 Core Data 不同,Core Data 可以仅通过 NSEntityDescription 信息(无需加载 NSManagedObjectModel)创建实例。
strong, nonatomic) NSManagedObjectContext* managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel NSBundle mainBundle] URLForResource:@"FKModel" withExtension:@"momd"]; // 加载应用的实体模型文件,并初始化NSManagedObjectModel 对象 _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
例如,NSDictionary 以及 Core Data 类, NSManagedObjectModel 提供了对快速迭代的支持; NSDictionary 枚举它的键, NSManagedObjectModel
在此仅对本文涉及的一些基础对象类型做简单的介绍和比较: •NSPersistentContainer vs CKContainerNSPersistentContainer通过处理托管对象模型(NSManagedObjectModel •NSManagedObjectModel vs SchemaNSManagedObjectModel是托管对象模型,标示着Core Data对应的数据实体(Enities)。 最终将其描述成NSEntityDescription并汇总到NSManagedObjectModel中。在CloudKit中用Record Types描述数据对象的名称、属性。 以私有数据库同步为例: •初始化:1.创建CKContainer2.根据NSManagedObjectModel配置Schema3.在私有数据库中创建ID为com.apple.coredata.cloudkit.zone
(1)NSManagedObjectModel(被管理的对象模型) 相当于实体,不过它包含 了实体间的关系 (2)NSManagedObjectContext(被管理的对象上下文) 操作实际内容
Data Stack iOS10中利用NSPersistentContainer iOS10之前涉及NSManagedObjectContext、NSPersistentStoreCoordinator、NSManagedObjectModel NSManagedObjectContext), 「persistent store coordinator」 (NSPersistentStoreCoordinator), 「managed object model」 (NSManagedObjectModel NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MoveBand" withExtension:@"momd"]; NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; NSAssert(mom ! Model"); // Create persistent store coordinator(创建NSPersistentStoreCoordinator对象(需要传入上述创建的NSManagedObjectModel
1.1.3 初始化机制 1,应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。 示例: NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext]; NSManagedObjectModel The schema is represented by a managed object model—an instance of NSManagedObjectModel. NSManagedObjectModel类中方法 - (void)setEntities:(NSArray *)entities forConfiguration:(NSString *) configuration will throw an exception _managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL
心酸~~~~ 2.1 iOS9 在iOS9中,CoreData Stack的三个核心类是这样的: -管理对象上下文NSManagedObjectContext 对象模型NSManagedObjectModel