与已获取属性的跨存储弱关系



我想在我的Core data模型中分离我的参考数据和我的用户数据,以简化我的应用程序的未来更新(因为,我计划将数据库存储在云中,没有必要将参考数据存储在云中,因为这是我应用程序的一部分)。因此,我一直在寻找一种使用获取的属性来编写跨存储关系的方法。

我有一个核心数据模型使用2个配置:

  • 数据模型配置1:UserData(实体相对于用户)

  • 数据模型配置2:ReferenceData(相对于应用程序本身的实体)

我为两个配置设置了2个不同的SQLite持久存储

  • UserData配置(和存储)包含实体"User"

  • ReferenceData配置(和存储)包含实体"Type"one_answers"Item"。

我想创建两个单向弱关系,如下所示:

  • "用户"具有唯一的"类型"

  • 一个"用户"有许多"项目"

以下是我的问题:

  • 我如何设置我的属性?

  • 我是否需要2个属性为每个关系(一个用于存储唯一ID和另一个访问我获取的结果)?

  • 这种弱关系是有序的吗?

  • 有人能给我一个例子实现这个吗?

作为Marcus回答的后续:

通过论坛和文档,我读到我应该使用我的实体实例的URI表示而不是objectID。这背后的原因是什么?

// Get the URI of my object to reference 
NSURL * uriObjectB [[myObjectB objectID] URIRepresentation];

接下来,我想知道,我如何将我的对象B URI (NSURL)作为弱关系存储在我的父对象A中?我应该使用什么属性类型?怎么转换呢?我听说过存档…

?

然后,稍后我应该以相同的方式检索托管对象(通过unconvert/unarchive的URIRepresentation),并从URI

获取object
// Get the Object ID from the URI 
NSManagedObjectID* idObjectB = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]];
// Get the Managed Object for the idOjectB ...

最后但并非最不重要的是,我是否应该在我的实体A中声明两个属性,一个用于持久化URI需求,另一个用于直接检索对象B?

NSURL * uriObjectB [objectA uriObjectB];
ObjectB * myObjectB = [objectA objectB];

正如你所读到的,我真的很想念一些简单的例子来实现这些弱关系!如果你能帮助我,我将非常感激。

拆分数据是目前为止正确的答案。参考数据不应该与云同步,特别是因为iCloud对允许应用程序同步和存储在文档中的内容有软上限。

创建跨商店的软引用(他们不需要是SQLite,但这是一个好主意,一般应用程序的性能),你需要有某种唯一的键,可以从另一边引用;一个很好的老式外键。

从那里你可以在模型中创建一个被获取的属性来引用实体。

虽然这种关系不能直接排序,但你可以通过排序索引创建顺序,或者如果它有一个逻辑排序,那么你可以在检索数据后对它进行排序(我使用方便的方法,返回一个排序数组而不是一个集合)。

我可以举个例子,但是你的思路是对的。唯一有趣的部分是迁移。当检测到迁移情况时,需要在构建核心数据堆栈之前独立迁移每个存储。这听起来很棘手,但实际上并不难做到。

假设你在用户存储区有一个UserBar实体,在引用存储区有一个RefBar实体。然后,RefBar将与UserBar建立fetchedProperty"关系",从而创建ToOne关系。

UserBar
----------
refBarID : NSInteger
RefBar
--------
identifier : NSInteger

然后你可以在modeler中的RefBar实体上创建一个已获取的属性,谓词为:

FETCHED_PROPERTY美元。refBarID == identifier

让名字谓词"userBarFetched"

这会返回一个数组所以我们想给RefBar添加一个方便的方法

@class UserBar;
@interface RefBar : NSManagedObject
- (UserBar*)userBar;
@end
@implementation RefBar
- (UserBar*)userBar
{
    NSArray *fetched = [self valueForKey:@"userBarFetched"];
    return [fetched lastObject];
}
@end

创建一个ToMany是相同的,除了您的便利方法将返回一个数组,并且您将在返回它之前对数组进行排序。

正如Heath Borders所提到的,如果您愿意,可以NSFetchedProperty添加排序,但必须在代码中完成。就我个人而言,我一直觉得这很浪费,所以不使用这个功能。如果我能在建模器中设置排序,可能会更有用。

使用ObjectID

我不建议使用ObjectID或URIRepresentation。ObjectID(以及该ObjectID的URIRepresentation)可以并且将会改变。每当迁移数据库时,该值都会发生变化。您最好创建一个不可更改的GUID。

弱关系

在关系的M端只需要一个值,该值存储外部标识符。在对象子类中,您只需要实现检索对象(或多个对象)的访问器。

我只支持一家商店。

要在云中存储内容,无论如何都必须将数据序列化,可以是JSON或SQL语句,也可以是您喜欢的任何模式。

您将需要用户设备上数据的本地副本,以便他可以快速脱机访问它。云商店只能有用户实体,而本地商店(应用程序的一部分)也可以有引用实体。

我有一个类似的项目,一个巨大的参考存储(20000条记录)与地理信息,和用户生成的内容("帖子")。我用的是单店。当我发布应用程序时,"posts"实体也被定义,但为空。当我更新数据模型时,我只是在发布之前重新生成整个参考存储。

我认为绝对没有理由在这里采用跨商店解决方案。

相关内容

  • 没有找到相关文章

最新更新