从实体中删除托管对象

时间:2011-07-05 18:56:16

标签: cocoa core-data

我有一个带有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

同样的错误。如何让它在特定实体中查找特定条目?!

任何帮助?

1 个答案:

答案 0 :(得分:4)

我认为你在实体和托管对象之间存在一些概念混淆。

实体类似于 抽象 。托管对象是NSManagedObject或其子类之一的实际单个 实例 。数据模型中的实体告诉托管对象上下文托管对象实例将具有哪些属性和彼此的关系。

实体仅存在于数据模型中,而受管对象位于“对象图”中,“对象图”是在内存中存活的相关对象的实际功能组。实体只是简单地向托管对象上下文描述所有内容如何组合在一起,因为类定义告诉编译器如何在类中组合所有属性和行为。作为实例的托管对象具有与所有其他活动对象一样的数据和行为。

同样,托管对象上下文不以任何方式添加,删除或设置实体的值。相反,它添加,删除或设置由其数据模型中的实体配置的托管对象的值。

所以,当你说:

  

我有一个带有2的managedObjectContext   实体,每个实体包含   多个实体。

你的真正含义是:

我有一个包含2个实体的数据模型和一个托管对象上下文,其中包含由这些实体配置的许多托管对象。

tableview可能只显示配置到一个实体(最常见)的实例中的数据,但实际数据以及插入和删除发生在托管对象实例上,而不是该点不可更改的实体。

但是,我不认为术语混淆是问题的真正原因。相反,我认为错误是试图告诉您,您正在从与实体B配置的对象的 必需 关系中删除EntityA配置的对象。

可可错误1570是NSValidationMissingMandatoryPropertyError,当您尝试保存具有nil值的必需属性的托管对象时,会出现名称建议。管理对象上下文尝试在保存之前验证对象图,当它找到缺少的必需属性时,它会抛出该错误。

我无法再告诉你了,因为我不知道你的数据模型是什么样的。