代码之家  ›  专栏  ›  技术社区  ›  Ian Turner

保存后核心数据有什么变化?

  •  0
  • Ian Turner  · 技术社区  · 15 年前

    我有一个核心的基于数据的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后面的额外'物体通常有这个额外的吗,或者它是从某个地方来的?如果它来自某个地方,并且导致提取请求失败,有人有什么好主意可以从哪里来,或者我如何跟踪它的源代码?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Marcus S. Zarra    15 年前

    听起来你在某个地方把某个东西设为零,让你把零拿回来。我将在调试器中遍历您的保存和获取代码,并在您不期望的情况下查找设置为nil的对象。

    更新

    你有密码吗 在任何地方 那是在操纵关系吗?也许是里面的东西 -awakeFromFetch: 这会导致关系被破坏?

    如果他们第一次保存正确,然后失败,那么 真正地 指出代码中的某些东西破坏了这些关系。你是子分类吗 NSManagedObject 对于这些物体?如果是这样的话,你是通过偶然超越 -init... 方法?

    更新

    最后的滴答声绝对不应该出现。检查您的获取请求,这可能归结为某个字符串中的一个简单的拼写错误…