如何删除/替换有序到多个核心数据关系中的对象?

时间:2013-08-16 23:05:32

标签: ios objective-c core-data

我有一个与实体有一对多关系的联系人实体,该实体存储有关电子邮件地址的信息(称为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] - [联系人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声称要提供的mutator,那么替换和删除对象的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

自动生成的代码有一个阻止其工作的错误。通过创建可变副本,更新和设置应该工作的解决方法。您看到的UI中的任何问题都应该是您监视更改/重新加载数据到UI的方式。

错误参考:here