ios – 与Fetched Properties的交叉存储弱关系?

我想将我的参考数据与我的核心数据模型中的用户数据分开,以简化我的应用程序的未来更新(因为,我计划将数据库存储在云上,并且不需要将参考数据存储在云上这是我申请的一部分).因此,我一直在寻找一种使用fetched属性编写跨店关系的方法.我还没有找到任何示例实现.

我有一个使用2种配置的Core Data模型:

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

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

> UserData配置(和存储)包含实体“用户”
> ReferenceData配置(和存储)包含实体“类型”和“项目”.

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

>“用户”具有唯一的“类型”
>“用户”有很多“项目”

这是我的问题:

>如何设置我的属性?
>每个关系是否需要2个属性(一个用于存储唯一ID,另一个用于访问我获取的结果)?
>可以订购这种弱关系吗?
>有人可以给我一个示例实现吗?

作为Marcus回答的后续内容:

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

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

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

然后,稍后我应该以相同的方式检索托管对象(通过非转换/取消归档URIRepresentation)并从URI获取对象

// Get the Object ID from the URI 
NSManagedObjectID* idObjectB = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]];

// Get the Managed Object for the idOjectB ...

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

NSURL * uriObjectB [objectA uriObjectB];

ObjectB * myObjectB = [objectA objectB];

你可以阅读,我真的很想念一些简单的例子来实现弱关系!我真的很感激一些帮助.

最佳答案
到目前为止,拆分数据是正确的答案.参考数据不应与云同步,尤其是因为iCloud对应用程序同步和存储在文档中的内容有软性限制.

要在商店之间创建软引用(它们不需要是SQLite,但对于一般的应用程序性能来说是个好主意),您需要拥有某种可以从另一方引用的唯一键.一个很好的老式外键.

从那里,您可以在模型中创建一个fetched属性以引用该实体.

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

我可以建立一个例子但你真的走在正确的轨道上.唯一有趣的部分是迁移.当您检测到迁移情况时,您需要在构建核心数据堆栈之前独立地迁移每个存储.这听起来很棘手但实际上并不难.

想象一下,您在用户存储中有一个UserBar实体,在参考存储中有一个RefBar实体.然后,RefBar将与UserBar具有fetchedProperty“关系”,从而创建ToOne关系.

UserBar
----------
refBarID : NSInteger

RefBar
--------
identifier : NSInteger

然后,您可以在建模器中的RefBar实体上创建一个fetched属性,其谓词为:

$FETCHED_PROPERTY.refBarID ==标识符

让谓词“userBarFetched”的名称

现在,这将返回一个数组,因此我们想要为RefBar添加一个方便的方法

@class UserBar;

@interface RefBar : NSManagedObject

- (UserBar*)userBar;

@end

@implementation RefBar

- (UserBar*)userBar
{
    NSArray *fetched = [self valueForKey:@"userBarFetched"];
    return [fetched lastObject];
}

@end

创建ToMany是相同的,除了你的方便方法会返回一个数组,你会在返回之前对数组进行排序.

如上所述,如果需要,可以向NSFetchedProperty添加排序,但必须在代码中执行此操作.就个人而言,我总是发现它浪费,不使用该功能.如果我可以在建模器中设置排序可能会更有用.

使用ObjectID

我不建议使用ObjectID或URIRepresentation. ObjectID(以及因此ObjectID的URIRepresentation)可以并且将会改变.每当您迁移数据库时,该值都将更改.您最好不要创建不变的GUID.

关系薄弱

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

转载注明原文:ios – 与Fetched Properties的交叉存储弱关系? - 代码日志