我有一个带有2个实体的managedObjectContext,每个实体包含多个条目。实体A的对象在表视图中表示,我希望用户能够删除任何实体是实体A.我的问题是,当我发送删除该条目的请求时,正在调用错误的实体!< / p>
仅供参考,我正在使用单独的方法处理删除过程,因此当表视图中的删除按钮被触发时,在从视图中删除之前,我首先要确保它已从managedObjectContext中删除。
- (BOOL) deleteCompletedSuccessfully : (EntityA *) anEntry
{
[self.managedObjectContext deleteObject: anEntry];
NSError *error = nil;
If (![self.managedObjectContext save:&error])
{
NSLog (@”%@”, [error userInfo]);
return NO;
}
return YES;
}
错误是:
Error Domain=NSCocoaErrorDomain Code=1570 \"The operation couldn\U2019t be completed. (Cocoa error 1570.)….
其余的错误消息表明我正在尝试删除EntityB中的nil对象!虽然anEntry实际上是在EntityA中。
我尝试将输入(anEntry就是这种情况)封装成一个数组,即:
- (BOOL) deleteCompletedSuccessfully : (NSArray *) array
{
EntryA *anEntry = [array objectAtIndex: 0];
// and the rest of the code
同样的错误。如何让它在特定实体中查找特定条目?!
任何帮助?
答案 0 :(得分:4)
我认为你在实体和托管对象之间存在一些概念混淆。
实体
实体仅存在于数据模型中,而受管对象位于“对象图”中,“对象图”是在内存中存活的相关对象的实际功能组。实体只是简单地向托管对象上下文描述所有内容如何组合在一起,因为类定义告诉编译器如何在类中组合所有属性和行为。作为实例的托管对象具有与所有其他活动对象一样的数据和行为。
同样,托管对象上下文不以任何方式添加,删除或设置实体的值。相反,它添加,删除或设置由其数据模型中的实体配置的托管对象的值。
所以,当你说:
我有一个带有2的managedObjectContext 实体,每个实体包含 多个实体。
你的真正含义是:
我有一个包含2个实体的数据模型和一个托管对象上下文,其中包含由这些实体配置的许多托管对象。
tableview可能只显示配置到一个实体(最常见)的实例中的数据,但实际数据以及插入和删除发生在托管对象实例上,而不是该点不可更改的实体。
但是,我不认为术语混淆是问题的真正原因。相反,我认为错误是试图告诉您,您正在从与实体B配置的对象的 必需 关系中删除EntityA配置的对象。
可可错误1570是NSValidationMissingMandatoryPropertyError,当您尝试保存具有nil值的必需属性的托管对象时,会出现名称建议。管理对象上下文尝试在保存之前验证对象图,当它找到缺少的必需属性时,它会抛出该错误。
我无法再告诉你了,因为我不知道你的数据模型是什么样的。