核心数据关系导致删除后保存错误

时间:2009-09-23 00:42:39

标签: core-data cascading-deletes

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

看到

http://jump.fm/BXRCG

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

for Outfit:

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向导可以看到我的方式错误,我会感到谦卑。但是说真的,谢谢!

我的模特图片: alt text http://img121.yfrog.com/img121/4413/picture11.png

最终更新:我无法将此标记解决,因为我没有真正解决它,但我确实有一个解决方案。在我的每个托管对象的.m中,我添加了一个类似于:

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

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

我仍然对“正确”答案感兴趣。但这是我的最佳解决方案,它确实可以对我的关系被删除的方式进行细致的控制。

8 个答案:

答案 0 :(得分:9)

我刚刚遇到删除失败的问题,并着手解决了这个问题。我已经弄清楚了我的问题,并认为我也会分享这个问题,也许有人会遇到同样的问题。

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

答案 1 :(得分:3)

您是否碰巧自己实施了一些关系的访问者? 我曾经有过像

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

在NSManagedObject的子类中并有一个保存错误。 发生的事情是,当从ManagedObjectContext中删除此对象时,CoreData会调用访问者“文章”来处理删除传播。这种重新计算的文章发生在删除传播期间,在我的案例中重新删除了无效的“文章”。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我无法将此标记解决,因为我没有真正解决它,但我确实有一个解决方法。在我的每个托管对象的.m中,我添加了一个类似于:

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

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

我仍然对“正确”答案感兴趣。但这是我的最佳解决方案,它确实可以对我的关系被删除的方式进行细致的控制。

答案 4 :(得分:0)

我遇到了类似的问题,结果发现问题出在.xib文件中。当我打开相关阵列控制器的“删除删除对象”(在Bindings-&gt; Content Set下)的复选框时,问题就消失了。

不知道这对你的情况是否有帮助,但是我已经有很多问题变得灰暗,而这些问题在Interface Builder内的某处隐藏了。

答案 5 :(得分:0)

在我的情况下,我在我的NSManagedObject的子类中无辜地创建了自定义方法:isDeleted。在删除/重命名之前,我遇到了奇怪的保存异常。 在失去理智之后,我这次再次阅读文档。 事实证明我覆盖了一个绝不能覆盖的NSManagedObject方法。

检查文档中的这段摘录是否可以帮助您:

  

您不得覆盖的方法

     

NSManagedObject本身定制了NSObject的许多功能   托管对象可以正确地集成到核心数据中   基础设施。 Core Data依赖于NSManagedObject的实现   以下方法,你绝对不能这样做   覆盖: primitiveValueForKey:,setPrimitiveValue:forKey:,   isEqual:,hash,superclass,class,self,isProxy,isKindOfClass:,   isMemberOfClass:,conformsToProtocol:,respondsToSelector:,   managedObjectContext,entity,objectID,isInserted,isUpdated,    isDeleted ,isFault,alloc,allocWithZone:,new,instancesRespondToSelector:,instanceMethodForSelector:,   methodForSelector:,methodSignatureForSelector:,   instanceMethodSignatureForSelector:或isSubclassOfClass:。

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

答案 6 :(得分:0)

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

我修理了:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}

答案 7 :(得分:0)

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

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

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