23

这个问题可能是一个很长的问题。删除实体后保存时,我无法弄清楚我在核心数据项目中遇到的错误。

我有两个主要的实体,一个服装和一个文章。我可以毫无问题地创建它们,但是当我删除它们时,我得到以下错误日志:

对于服装:

2009-09-22 20:17:37.771 itryiton[29027:20b] Operation could not be completed. (Cocoa error 1600.)
2009-09-22 20:17:37.773 itryiton[29027:20b]   {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = outfitArticleViewProperties;
    NSValidationErrorObject = <Article: 0x12aa3c0> (entity: Article; id: 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1> ; data: {
    articleID = 2009-09-22 19:05:19 -0400;
    articleImage = 0x12b4de0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 19:05:19 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue =     {(
        <OutfitArticleViewProperties: 0x1215340> (entity: OutfitArticleViewProperties; id: 0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1> ; data: {
    article = 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1>;
    articleViewPropertiesID = nil;
    outfit = nil;
    touch = nil;
    view = "(...not nil..)";
})
    )};
}

如果我删除一篇文章,我会得到:

2009-09-22 18:58:38.591 itryiton[28655:20b] Operation could not be completed. (Cocoa error 1560.)
2009-09-22 18:58:38.593 itryiton[28655:20b]   DetailedError: {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = articleImage;
    NSValidationErrorObject = <Article: 0x12aa340> (entity: Article; id: 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1> ; data: {
    articleID = 2009-09-22 18:58:26 -0400;
    articleImage = 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 18:58:26 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b5010 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue = <ArticleImage: 0x12ad600> (entity: ArticleImage; id: 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1> ; data: {
    article = 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1>;
    image = "(...not nil..)";
});
}

1600 错误是:

NSValidationRelationshipDeniedDeleteError表示 与删除规则 NSDeleteRuleDeny 的
某些关系的错误代码 是非空的。

适用于 Mac OS X v10.4 及更高版本。

在 CoreDataErrors.h 中声明。

但我一辈子都看不到哪种关系会阻止删除。如果某些 Core Data 向导可以看到我的方法的错误,我会感到谦卑。

我无法将此标记为已解决,因为我并没有真正解决它,但我确实有一个解决方法。在.m我的每个managedObjects我添加了一个看起来像这样的方法:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

所以你可以看到,首先我手动清除了关系,然后我让对象自己删除。在其他对象中nil-ing,我的 delete 方法在某些对象关系上调用,而不是 ,以获得级联。

4

8 回答 8

9

我只是遇到了删除失败的问题,并遇到了这个问题。而且我已经弄清楚了我的问题,并认为我也会分享它,也许有人也会遇到同样的问题。

我犯的错误是我试图删除的对象 (A) 与另一个对象 (B) 有关系,其中 NULL 作为删除规则。但是,对象 B 也与 A 有关系,并且它是非可选的。因此,当我删除 A 时,B 与 A 的关系变为 null,这是不允许的。当我将删除规则更改为级联时,它起作用了。

于 2011-12-10T06:58:55.030 回答
3

我无法将此标记为已解决,因为我并没有真正解决它,但我确实有一个解决方法。在我的每个 managedObjects 的 .m 中,我添加了一个方法,如下所示:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

所以你可以看到,首先我手动清除了关系,然后我让对象自己删除。在其他对象中,不是 nil-ing,而是在某些对象关系上调用我的 delete 方法,以获得级联。

我仍然对“正确”的答案感兴趣。但这是我拥有的最好的解决方案,它确实允许对如何删除我的关系进行一些细粒度的控制。

于 2009-10-17T05:01:18.490 回答
3

您是否碰巧自己实现了一些关系访问器?我曾经有一个类似的代码

-(NSSet*)articles
{
       re-calculates properties....
       return [self primitiveValueForKey:@"articles"];
}

在 NSManagedObject 的子类中并且有一个保存错误。发生的情况是,当从 ManagedObjectContext 中删除该对象时,CoreData 调用访问器“articles”来处理删除传播。文章的重新计算发生在删除传播期间,这在我的情况下重新恢复了无效的“文章”。

于 2010-01-03T01:25:47.720 回答
2

检查您的xcdatamodel文件是否有Deny删除规则。单击每个关系,直到找到它。您需要更改此规则或调整删除托管对象的方式,以预期该规则对关系的应用。

于 2009-09-23T00:46:33.743 回答
1

我最近遇到了这个错误,因为我在 - (void)willSave 方法中有代码,它在 - (BOOL)isDeleted 已经返回 true 之后更新了删除托管对象的一些属性。

我通过以下方式修复了它:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}
于 2013-05-21T14:19:21.283 回答
0

我有一个类似的问题,原来问题出在 .xib 文件中。当我打开相关数组控制器的“删除时删除对象”复选框(在 Bindings->Content Set 下)时,问题就消失了。

不知道这对你的情况是否有帮助,但我已经有很多头发变白了,这些问题原来隐藏在 Interface Builder 的某个地方。

于 2009-12-03T18:27:51.923 回答
0

就我而言,我在 NSManagedObject 的子类中天真地创建了自定义方法:isDeleted。在删除/重命名它之前,我遇到了奇怪的保存异常。在失去理智之后,我这次更彻底地再次阅读了文档。事实证明,我重写了一种不得重写的 NSManagedObject 方法。

检查此文档摘录是否对您有帮助:

不能覆盖的方法

NSManagedObject 本身自定义了 NSObject 的许多特性,以便托管对象可以正确地集成到 Core Data 基础设施中。Core Data 依赖于 NSManagedObject 对以下方法的实现,因此您绝对不能覆盖这些方法: primitiveValueForKey:、setPrimitiveValue:forKey:、isEqual:、hash、超类、class、self、isProxy、isKindOfClass:、isMemberOfClass:、conformsToProtocol:、responsToSelector :, managedObjectContext, entity, objectID, isInserted, isUpdated, isDeleted和 isFault, alloc, allocWithZone:, new, instancesRespondToSelector:, instanceMethodForSelector:, methodForSelector:, methodSignatureForSelector:, instanceMethodSignatureForSelector: 或 isSubclassOfClass:。

此外 - 您可以覆盖其他方法,但您必须调用超级实现,例如或调用:willAccessPrimitiveForKey, didAccessPrimitiveForKey在访问器和willChangevalueForKey, didChangeValueForKey设置器中......

于 2013-02-12T14:28:33.253 回答
0

在非可选的父子关系上,我遇到了与级联删除非常相似的问题。这很令人困惑,因为我认为父关系删除规则设置为级联。事实证明,Xcode 中的数据模型编辑器没有保存删除规则。我会将其设置为 Cascade,转到不同的视图并返回,它将再次设置为无效。我不得不重新启动 Xcode 并将删除规则设置为级联。在我这样做之后,一切正常。

因此,如果其他人遇到此问题,请在深入研究更复杂的解决方案之前仔细检查 Xcode 是否正在保存您的删除规则。

顺便说一句,我在 iOS 上通过 Xcode 5 的数据模型编辑器使用核心数据。

于 2014-01-01T19:11:29.593 回答