Cocoa 核心数据跨存储获取属性
我目前正在思考核心数据的一些问题。 我在自己的存储中有一个用户模型,我无法控制它,因为它附带了一个框架。将自动创建此模型的持久存储协调器、托管对象模型和上下文,并且无法触及。其中,该模型有一个单用户实体 另一方面,我有一个属性模型,其中包含一个我完全可以控制的属性实体。在那里,我将一些用户实体的属性存储在另一个存储中。用户和属性实体都具有类似于外键的id属性。 该模型有自己的持久存储协调器、托管对象模型和上下文 我现在想要的是将关联的用户实体作为属性实体的属性,这样我就可以绑定到类似于Cocoa 核心数据跨存储获取属性,cocoa,core-data,fetched-property,Cocoa,Core Data,Fetched Property,我目前正在思考核心数据的一些问题。 我在自己的存储中有一个用户模型,我无法控制它,因为它附带了一个框架。将自动创建此模型的持久存储协调器、托管对象模型和上下文,并且无法触及。其中,该模型有一个单用户实体 另一方面,我有一个属性模型,其中包含一个我完全可以控制的属性实体。在那里,我将一些用户实体的属性存储在另一个存储中。用户和属性实体都具有类似于外键的id属性。 该模型有自己的持久存储协调器、托管对象模型和上下文 我现在想要的是将关联的用户实体作为属性实体的属性,这样我就可以绑定到类似于mypro
myproperty.user.SomeValueOfUserEntity
(我知道在使用获取的属性时,myproperty可能是一个数组)的关键路径
但是,由于不支持跨存储关系,我考虑通过获取属性使用弱关系。这只需要匹配两个对应的id属性。我已经在Xcode中为用户创建了一个Fetched属性,并在属性实体的类文件中创建了所需的访问器(正如在其他问题中所建议的,我将Fetched属性返回的值视为数组)
但是,我无法在Xcode中为获取的属性设置目标实体,因为目标实体位于完全不同的存储中。我还需要在属性存储中定义我的用户实体吗?如果是这样,核心数据如何知道该实体不是从我的属性存储中提取的,而是从用户存储中提取的
一些线程提到为此使用配置,但我找不到任何文档,除了提到“为此使用配置”之外
有人能告诉我如何设置跨存储获取的属性吗# 您可以使用多个共享同一数据模型的持久存储:
- 使用单一数据模型(xcdatamodeld)并添加所有实体
- 为每个“逻辑集”创建配置(编辑器/添加配置) 应存储在单独存储文件中的实体
- 将实体指定(拖动)到适当的配置
- 将配置的持久存储添加到您的上下文中(见下文)
- 配置获取的属性
感谢您的回复和帮助。但是,现在添加只读存储时,会出现“用于打开存储的模型与用于创建存储的模型不兼容”错误。mom是从.xcdatamodel文件创建的,该文件包含其配置中的所有实体。仅仅添加动态存储不会引起问题,而且还会创建一个.sqlite文件,其中包含所有实体的表。仅仅添加静态存储不起作用。我已经用我的代码创建了一个更详细的Gist()。有什么想法吗?可能这意味着您必须使用最新的模型重新创建存储文件(即sqlite数据库)。我的代码:
NSString*path=[[NSBundle mainBundle]pathForResource:@“MyModel”类型:@“momd”];NSURL*momURL=[NSURL fileURLWithPath:path]_managedObjectModel=[[NSManagedObjectModel alloc]initWithContentsOfURL:momURL]代码>另请注意,很抱歉耽搁了很长时间才回复
// 1. Add "static", read-only store
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"your static configuration name goes here..."
URL:storeUrl
options:@{
NSReadOnlyPersistentStoreOption: @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
}
error:&error];
// 2. Add "dynamic", writable content
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"your dynamic configuration name goes here..."
URL:storeUrl
options:@{
NSMigratePersistentStoresAutomaticallyOption: @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
}
error:&error];