如何删除/替换有序对多 CoreData 关系中的对象?

Posted

技术标签:

【中文标题】如何删除/替换有序对多 CoreData 关系中的对象?【英文标题】:How do I remove/replace objects in an ordered to-many CoreData relationship? 【发布时间】:2013-08-16 23:05:32 【问题描述】:

我有一个联系人实体,它与另一个存储电子邮件地址信息的实体具有一对多关系(称为 TypedValue,因为它还包括电子邮件类型,如个人、工作等)。

这种关系(自然称为“电子邮件”)也是有序的,因此我可以在表格视图中显示联系人的电子邮件地址列表,并允许用户删除或修改每个。据我所知,需要订购它们,以便我可以知道哪个被删除/修改:例如,如果用户点击第 1 行中的删除按钮,则应从关系中删除第二个电子邮件地址。没有被命令,我不知道该删除哪一个。

在生成 NSManagedObject 子类时,我在该类上获得了一个 NSOrderedSet 属性,CoreData 在 .h 文件中提供了一些访问器:

@interface Contact (CoreDataGeneratedAccessors)
- (void)insertObject:(TypedValue *)value inEmailsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromEmailsAtIndex:(NSUInteger)idx;
- (void)insertEmails:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeEmailsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInEmailsAtIndex:(NSUInteger)idx withObject:(TypedValue *)value;
- (void)replaceEmailsAtIndexes:(NSIndexSet *)indexes withEmails:(NSArray *)values;
- (void)addEmailsObject:(TypedValue *)value;
- (void)removeEmailsObject:(TypedValue *)value;
- (void)addEmails:(NSOrderedSet *)values;
- (void)removeEmails:(NSOrderedSet *)values;
@end

我的问题是只有其中一些有效。 addEmailsObject: 工作得很好,但删除或替换方法不行。如果我尝试用这个调用替换集合中的一个对象:

// newVal is a properly-built object requested from the managed object context
[self replaceObjectInEmailsAtIndex:index withObject:newVal];

我收到一个严重的错误:

2013-08-16 16:51:19.687 AppName[43837:c07] -[Contact replaceObjectInEmailsAtIndex:withObject:]:无法识别的选择器发送到实例 0xa56a800 2013-08-16 16:51:19.694 AppName[43837:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[联系 replaceObjectInEmailsAtIndex:withObject:]:无法识别的选择器发送到实例 0xa56a800'

根据我的阅读,如果进行调用的对象(在本例中为 Contact 对象)是使用常规 alloc/init 创建的,而不是从托管对象上下文中请求的,则可能会发生这种情况,但我正在做那部分是正确的。

我还尝试获取 NSOrderedSet 对象的可变副本,以进行更新然后替换集合:

NSMutableOrderedSet *newSet = [self.emails mutableCopy];
[newSet replaceObjectAtIndex:index withObject:newVal];
[self setEmails:newSet];

这没有引发任何错误,但做了一些奇怪的事情:我的界面开始显示不正确的值,我不确定发生了什么。

那么:如果不使用 CoreData 声称提供的 mutators,那么替换和删除对象的正确方法是什么?

【问题讨论】:

【参考方案1】:

自动生成的代码有一个错误,导致它无法工作。您的解决方法是创建一个可变副本,更新和设置应该可以工作。您在 UI 中看到的任何问题都应该是您如何监控更改/将数据重新加载到 UI 的一个方面。

错误参考:here。

【讨论】:

我真的希望我只是错过了一些愚蠢的事情,而我的情况与其他问题有所不同。令人难以置信的是,他们会在这里自动生成损坏的代码。 跟进:您对 UI 问题的看法是正确的。我正在做一些愚蠢的事情来向表格提供数据,并且没有正确更新它。现在使用可变副本似乎工作得很好。再次感谢!

以上是关于如何删除/替换有序对多 CoreData 关系中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中替换多对多关系中的实体

CoreData 多对多关系插入和删除操作

保存循环删除多对多CoreData关系的一端

CoreData 多对多关系

CoreData 不会删除自动生成的关系表中的记录

CoreData:如何建模循环多对多关系