我有一个核心的基于数据的Mac应用程序,在我保存一个文件之前,它工作得非常好。当我保存一个文件时,核心数据似乎发生了一些变化,因为我的原始提取请求不再提取任何内容。这是在保存前工作,但在保存后返回空数组的提取请求。
NSEntityDescription *outputCellEntityDescription = [NSEntityDescription entityForName:@"OutputCell"
inManagedObjectContext:[[self document] managedObjectContext]];
NSFetchRequest *outputCellRequest = [[[NSFetchRequest alloc] init] autorelease];
[outputCellRequest setEntity:outputCellEntityDescription];
NSPredicate *outputCellPredicate = [NSPredicate predicateWithFormat:@"(cellTitle = %@)", outputCellTitle];
[outputCellRequest setPredicate:outputCellPredicate];
NSError *outputCellError = nil;
NSArray *outputCellArray = [[[self document] managedObjectContext] executeFetchRequest:outputCellRequest
error:&outputCellError];
我已经检查了[[[self document]managedObjectContext]registeredObjects]以查看保存后该对象仍然存在,并且似乎没有任何更改,并且该对象仍然存在。这可能是相当基本的事情,但有人知道我可能做错了什么吗?如果没有,有人能给我任何提示,告诉我保存后核心数据模型中可能有什么不同,这样我就有了一些线索,为什么保存后提取请求停止工作了?
编辑
我已经弄清楚了,似乎是储蓄之后关系破裂了。如果省略为请求设置谓词的行,则请求将返回数组中的对象。我已经检查了registeredObjects,并且看起来关系是完整的,但是如果我执行了类似保存文件的操作,请重新打开它,然后检查registeredObjects,关系设置为nil。我已经将一个保存文件打开为一个XML文件,并且在第一次保存该文件时,这些关系看起来是完整的。
我已经添加了一个核心数据模型部分的屏幕截图,如果关系被破坏了。有人知道为什么在核心数据中保存一个文件会破坏关系吗?作为参考,我使用的是内置于核心数据中的保存的默认实现,因此没有自定义的保存代码。
http://emberapp.com/splash6/images/littlesnapper/sizes/m.png
编辑
我没有
-awakeFromFetch:
引发此问题时触发的方法。
我有次等级
NSManagedObject
对于一些问题对象,使用kvo的核心配方模型:
+(void)initialize
{
if (self == [OutputCell class])
{
NSArray *nameKeys = [NSArray arrayWithObjects:@"cell", @"sheet", @"table", nil];
[self setKeys:nameKeys
triggerChangeNotificationsForDependentKey:@"cellTitle"];
NSArray *measuresKeys = [NSArray arrayWithObjects:@"fivePercentile", @"maximum", @"mean", @"median",@"minimum",@"ninetyFivePercentile",@"standardDeviation",nil];
[self setKeys:measuresKeys
triggerChangeNotificationsForDependentKey:@"analysisResults"];
}
}
此方法似乎不会在保存期间或之后触发,因此似乎不会导致问题的发生。我目前正在研究代码中的所有其他方法,以确定它们中是否有任何方法在保存期间或之后被调用。
编辑
根据下面马库斯的建议,在保存模型之前,我设法使一个获取请求失败。我现在的问题是,当控制台发生故障时,返回的消息是:
HIToolbox: ignoring exception '+entityForName: could not locate an NSManagedObjectModel for entity name 'OutputCell'' that raised inside Carbon event dispatch
此调用后会记录控制台消息:
NSEntityDescription *outputCellEntityDescription = [NSEntityDescription entityForName:@"OutputCell"
inManagedObjectContext:[[self document] managedObjectContext]];
控制台消息中outputcell后面的额外'物体通常有这个额外的吗,或者它是从某个地方来的?如果它来自某个地方,并且导致提取请求失败,有人有什么好主意可以从哪里来,或者我如何跟踪它的源代码?