这个问题可能是一个很长的过程。在删除实体后保存时,我无法弄清楚我在核心数据项目中遇到的错误。我的.xcdatamodel可以在:
看到我有两个与我合作的主要实体,一套装和一条。我可以毫无问题地创建它们,但是当我删除它们时,我会得到以下错误日志:
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方法,以获得级联。
我仍然对“正确”答案感兴趣。但这是我的最佳解决方案,它确实可以对我的关系被删除的方式进行细致的控制。
答案 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的数据模型编辑器。