保存后Core Data会发生什么变化?

时间:2010-03-18 06:34:55

标签: cocoa macos core-data

我有一个基于Core Data的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:方法。

我使用KVO的Core Recipes模型对某些问题对象进行了分类NSManagedObject

    +(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"];
    }
}

此方法似乎在保存期间或之后不会触发,因此似乎不会导致问题。我目前正在通过代码中的所有其他方法来查找是否在保存期间或之后调用它们中的任何一个。

修改

继Marcus的建议之后,我设法在保存模型之前使获取请求失败。我现在的问题是它在失败时在控制台中返回的消息:

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之后的额外'是否应该存在?对象通常有这个额外的',或者它来自某个地方?如果它来自某个地方并且导致获取请求失败,那么是否有人有任何明智的想法,这可能来自或如何跟踪它的源?

1 个答案:

答案 0 :(得分:1)

听起来你正在某些地方设置一些东西并且让你没有回头。我将在调试器中查看保存和获取代码,并在您不期望的时候查找设置为nil的对象。

更新

您是否有可以操纵关系的任何代码 ?也许-awakeFromFetch:中导致关系被破坏的东西?

如果他们第一次正确保存然后失败,则真正指向代码中的某些内容会破坏这些关系。您是否为这些对象创建了NSManagedObject的子类?如果是这样的话,你是否可以通过改变-init...方法?

更新

最后一个滴答应该绝对不存在。检查你的获取请求,这可能都归结为某个字符串中的简单拼写错误...