iOS核心数据:存储与不同实体中任何NSManagedObject的关系

Posted

技术标签:

【中文标题】iOS核心数据:存储与不同实体中任何NSManagedObject的关系【英文标题】:iOS Core Data: store relationship to ANY NSManagedObject in different entity 【发布时间】:2012-05-03 12:15:41 【问题描述】:

我想实现一个引用任何类型对象的表,例如一个存档表,它引用来自人员、地址、...的对象

当然,我不喜欢为每个表(archivedPersons、archivedAddresses 等)建立额外的关系。有没有办法简单地与“NSManagedObject”建立关系?保存属性“NSManagedObject”并为每个归档对象创建一个条目也没有问题。

【问题讨论】:

【参考方案1】:

不幸的是,你有点卡住了。您可以创建一个基础实体,并从中继承其他实体。然后,您可以只与 Base 实体建立一对多的关系。

这很好用,就像您认为的那样。但是,有一个很大的缺点。所有子实体都分组到一个表中。因此,子实体中的每个属性都有一个列。如果您没有大型数据库,这可能没问题。或者,如果您的行填充了大约 70%,那么也可以。您应该检查将浪费多少空间,看看这个选项是否真的适合您。

另一种方法是存储一组对象 ID,并手动获取引用的对象。

或者,如您之前所述,为每种实体类型使用一个引用。

【讨论】:

我也考虑过使用基本实体解决方案,但这个缺点让我重新思考。我的基本实体将只有几个 BOOL 字段 - 所以这不应该有问题,是吗?实体仅从其超类继承属性,不是吗?还是真的是一张包含所有属性的表?【参考方案2】:

您可以这样做,但您必须自己编写一些代码。如果我理解正确,您希望与任何类型的对象建立对多关系。

您需要做的是与对象一起存储一组(可能是有序的)对象 ID。然后,您必须使用 Core Data 文档的非标准持久属性部分中描述的技术之一从托管对象 对象 ID 集进行转换。

如果您有一组 URL(来自 -[NSManagedObjectID URIRepresentation]),您可以使用 NSPropertyListSerialization 对其进行序列化和反序列化。

您有一组 URL,您可以将它们转换为对象。这是事情变得有点棘手的地方。您必须使用NSFetchRequest,但您只能针对每个实体执行此操作。因此,您最好将实体名称与 objectID 一起存储。

由于获取请求的开销很大,您可能希望将-[NSManagedObjectContext objectRegisteredForID: 用于您尝试转换为对象的所有对象 ID。如果此方法返回非nil,您可以直接使用该对象而无需执行 I/O(即获取请求)。然后,您只需对这些对象 ID 执行获取请求,此方法返回 nil(如果有)。

我已经做到了。有用。但这并不简单。

【讨论】:

【参考方案3】:

我有同样的问题(对于我的离线同步算法)

错误配置的属性:Transactions.object 必须有一个目标实体 0_0

并认为很好的解决方案,除了存储 ID 和用于搜索的表名称 - 存储 1 到需要实体的链接。像这样: 但我们不应该总是寻找实体。 o_0

BEFORE
@interface Transactions : NSManagedObject

@property (nonatomic, retain) NSNumber * type;
@property (nonatomic, retain) NSNumber * order;
@property (nonatomic, retain) NSManagedObject *object;



AFTER
@interface Transactions : NSManagedObject

@property (nonatomic, retain) NSNumber * type;
@property (nonatomic, retain) NSNumber * order;
@property (nonatomic, retain) Workgroup *workgroup;
@property (nonatomic, retain) AgendaItem *agendaItem;
@property (nonatomic, retain) Meeting *note;
@property (nonatomic, retain) Meeting *meeting;
@property (nonatomic, retain) Person *person;

但是!如果我们创建对象并删除它 - 我们意识到我们必须存储类型和 ID (( 这意味着 - 最后一个解决方案不适合删除实体的情况。并解决,属于我的情况是: 我谴责自己不断通过表名和 ID 搜索实体 o_o

【讨论】:

以上是关于iOS核心数据:存储与不同实体中任何NSManagedObject的关系的主要内容,如果未能解决你的问题,请参考以下文章

与现有核心数据实体不同

IOS - 目标 C,如何读取核心数据并将其存储到可变数组中

相关实体的 iOS 核心数据持久性

如何在核心数据iOS中获取每个实体的最后一个条目

从核心数据中删除实体

如何使用核心数据访问保存在不同视图控制器中的阵列?