1

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

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

4

3 回答 3

1

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

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

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

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

于 2012-05-03T14:16:58.097 回答
1

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

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

如果您有一组 URL(来自-[NSManagedObjectID URIRepresentation]),您可以使用NSPropertyListSerialization.

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

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

我已经做到了。有用。但这不是直截了当的。

于 2012-05-05T13:17:27.627 回答
0

我有同样的问题(对于我的离线同步算法) 并有错误:**配置错误的属性:Transactions.object 必须有一个目标实体**

错误配置的属性: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 搜索实体 我谴责自己的常数按表名和 ID o_o 搜索实体

于 2012-10-24T16:32:58.653 回答