核心数据多实体

Posted

技术标签:

【中文标题】核心数据多实体【英文标题】:Core data multiple Entities 【发布时间】:2011-12-15 12:50:41 【问题描述】:

我对核心数据有疑问。 我有一个带有多个标签的应用程序。每个选项卡都包含一个不同“对象”的列表。 在每个选项卡中,我都有一个添加按钮 (+),可将我带到可以添加“对象”的屏幕。

问题:

当我单击添加实体以进行插入时,正在创建并添加到上下文中。

所以,我进入第一个选项卡,单击添加 - 一个实体在上下文中。 我在其他选项卡上,单击添加 - 另一个实体在上下文中。

我完成为其中之一添加信息(有效)并点击保存。 现在核心数据抛出一个异常,说无法保存上下文,因为其他实体无效。

我想到的一个想法是:

从上下文中复制所有无效的对象,保存上下文,将复制的对象添加回来(在需要时等等)。

但是一个实体可能与其他实体有其他关系,因此 Person 可以有地址、角色、联系方式……而 Company 可以有 Address、Employes ……等等。 如果 person 无效并且关系 Address valid ,上述想法失败,因为不会保存 person 但会保存 address ,这是不正确的。

具有临时上下文的东西可以工作,但我不清楚如何实现这一点。

另一个想法是在我想保存实体(例如人)时获取它的所有关系,并且只保存人。 但是我没有实现递归函数(问题在于关系是反向的,因为我的核心数据模型上有很多关系(人有联系方式,也有公司)。

代码如下:

- (void)relationshipInstancesForManagedObject:(NSManagedObject *)managedObject andSkipValue:(id)skipValue andSet:(NSMutableSet *)set for (NSRelationshipDescription *relationship in managedObject.entity.properties) if (![relationship isKindOfClass:[NSRelationshipDescription class]]) 继续; id value = [managedObject valueForKey:relationship.name]; if (value == skipValue || value == nil || value == self || [set containsObject:value] ) 继续; NSLog(@"%@",value); 如果(relationship.isToMany) if ([value containsObject:skipValue] || [value containsObject:managedObject] || [value count] == 0) 继续; for (NSManagedObject *实体值) [设置添加对象:实体]; [自我关系InstancesForManagedObject:实体 和SkipValue:skipValue 和设置:设置]; 别的 如果(值!= nil) [设置添加对象:值]; [自我关系InstancesForManagedObject:值 和SkipValue:skipValue 和设置:设置];

如果您有任何想法,我将不胜感激。

【问题讨论】:

尽量不要将实体与对象混淆。与类一样,实体描述了特定类型的托管对象——给定实体的所有对象都将具有相同的属性集。 【参考方案1】:

解决问题的最简单方法是确保在将所有对象添加到商店时都有效。首先收集创建有效对象所需的信息,然后才添加一个新对象以及所有必需的信息。

另外,请仔细考虑您是否需要要求您当前所做的所有属性。如果您有两个实体,每个实体都与另一个实体有关系,您是否需要这两种关系?你能把其中一种关系设为可选吗?这可以帮助您避免先有鸡还是先有蛋的问题,即无法为任一实体添加对象,因为尚不存在其他类型。

【讨论】:

谢谢。那是我的最终解决方案。确保数据在保存时有效。在标签更改时,我会发布一条消息,让用户知道如果他不保存数据,信息将会丢失,然后根据用户选项删除/保存数据。 @victorash 如果这是您的最终解决方案,您应该接受 Caleb 的回答。

以上是关于核心数据多实体的主要内容,如果未能解决你的问题,请参考以下文章

涉及新实体和一对多关系的核心数据迁移

Swift核心数据多对多关系不保存实体

核心数据:删除最后一个具有一对多关系的实体

iOS:删除核心数据中具有一对多关系的实体

来自核心数据多对多关系的随机实体

核心数据:以一对多的关系获取实体的获取请求