Cle*_*t M 4 core-data weak relationships ios
我想将我的参考数据与我的核心数据模型中的用户数据分开,以简化我的应用程序的未来更新(因为,我计划将数据库存储在云上,并且不需要将参考数据存储在云上这是我申请的一部分).因此,我一直在寻找一种使用fetched属性编写跨店关系的方法.我还没有找到任何示例实现.
我有一个使用2种配置的Core Data模型:
数据模型配置1:UserData(相对于用户的实体)
数据模型配置2:ReferenceData(相对于应用程序本身的实体)
我为这两个配置设置了两个不同的SQLite持久存储.
UserData配置(和存储)包含实体"用户"
ReferenceData config(和store)包含实体"Type"和"Item".
我想创建两个单向弱关系,如下所示:
"用户"有一个独特的"类型"
"用户"有很多"项目"
这是我的问题:
如何设置我的属性?
每个关系是否需要2个属性(一个用于存储唯一ID,另一个用于访问我获取的结果)?
可以订购这种弱关系吗?
有人可以给我一个示例实现吗?
作为Marcus回答的后续内容:
通过论坛和文档,我读到我应该使用我的实体实例的URI表示而不是objectID.这背后的原因是什么?
// Get the URI of my object to reference
NSURL * uriObjectB [[myObjectB objectID] URIRepresentation];
Run Code Online (Sandbox Code Playgroud)
接下来,我想知道,如何将我的对象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 ...
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是,我要在我的实体A中声明两个属性,一个用于持久化URI需求,另一个用于检索direclty对象B?
NSURL * uriObjectB [objectA uriObjectB];
ObjectB * myObjectB = [objectA objectB];
Run Code Online (Sandbox Code Playgroud)
你可以阅读,我真的很想念一些简单的例子来实现弱关系!我真的很感激一些帮助.
到目前为止,拆分数据是正确的答案.参考数据不应与云同步,尤其是因为iCloud对应用程序同步和存储在文档中的内容有软性限制.
要在商店之间创建软引用(它们不需要是SQLite,但对于一般的应用程序性能来说是个好主意),您需要拥有某种可以从另一方引用的唯一键.一个很好的老式外键.
从那里,您可以在模型中创建一个fetched属性以引用该实体.
虽然这种关系不能直接排序,但您可以通过排序索引创建订单,或者如果它具有逻辑排序,那么您可以在检索数据后对其进行排序(我使用便捷方法返回排序数组而不是集合).
我可以建立一个例子但你真的走在正确的轨道上.唯一有趣的部分是迁移.当您检测到迁移情况时,您需要在构建核心数据堆栈之前独立地迁移每个存储.这听起来很棘手但实际上并不难.
想象一下,您在用户存储中有一个UserBar实体,在参考存储中有一个RefBar实体.然后,RefBar将与UserBar具有fetchedProperty"关系",从而创建ToOne关系.
UserBar
----------
refBarID : NSInteger
RefBar
--------
identifier : NSInteger
Run Code Online (Sandbox Code Playgroud)
然后,您可以在建模器中的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
Run Code Online (Sandbox Code Playgroud)
创建ToMany是相同的,除了你的方便方法会返回一个数组,你会在返回之前对数组进行排序.
正如Heath Borders所提到的,可以根据需要添加排序,NSFetchedProperty但必须在代码中进行排序.就个人而言,我总是发现它浪费,不要使用该功能.如果我可以在建模器中设置排序可能会更有用.
我不建议使用ObjectID或URIRepresentation.ObjectID(以及因此ObjectID的URIRepresentation)可以并且将会改变.每当您迁移数据库时,该值都将更改.您最好不要创建不变的GUID.
您只需要在关系的M侧有一个值并存储外部标识符.在对象子类中,您只需要实现检索对象(或对象)的访问器.
| 归档时间: |
|
| 查看次数: |
2002 次 |
| 最近记录: |