【问题标题】:NSManagedObject FaultedNSManagedObject 故障
【发布时间】:2011-09-25 23:12:31
【问题描述】:

我有一个 NSManagedObject,它的一些属性在程序开始时初始化。当我稍后引用这个对象时,它似乎有问题,并且属性不可访问。我不确定我需要做什么。

这与添加到程序中的一项新功能有关,该程序在所有其他方面都与核心数据顺利运行。

这是一个代码 sn-p,它被初始化为单例的属性值。 (我的代码的许多部分都可以访问该单例):

    favoritesCollection = [[SearchTerms alloc] initWithEntity:[NSEntityDescription entityForName:@"SearchTerms" inManagedObjectContext:moc] insertIntoManagedObjectContext:moc];

    favoritesCollection.keywords = @"Favorites List";
    favoritesCollection.isFavoritesCollection = [NSNumber numberWithBool:YES];
    favoritesCollection.dateOfSearch = [NSDate NSCExtendedDateWithNaturalLanguageString:@"4000"];
    favoritesCollection.pinColorIndex = 0;  

    [moc save:&error];

    NSLog(@"(favoritesCollection) = %@", favoritesCollection);
}

return favoritesCollection;

当我使用 NSLog 查看 favoritesCollection 时,我看到了这一点(我添加了一些换行符以使其更易于阅读):

(favoritesCollection) = 
<SearchTerms: 0x5c28820> 
(entity: SearchTerms; id: 0x5a6df90 
<x-coredata://3936E19F-C0D0-4587-95B6-AA420F75BF78/SearchTerms/p33> ; 
data: {
    dateOfSearch = "4000-09-25 12:00:00 -0800";...*more things after this*

返回后,另一个NSLog显示内容完好。

当我稍后引用这个实例时,我可以在调试器中看到这个:

<SearchTerms: 0x5c28820> 
(entity: SearchTerms; id: 0x5a6df90 
<x-coredata://3936E19F-C0D0-4587-95B6-AA420F75BF78/SearchTerms/p33> ; 
data: <fault>)

仅此而已。

所以我相信该对象被保留(我明确地将它保留在它返回的地方)。我有僵尸,它看起来不像僵尸。

我程序中只有一个managedObjectContext,在单例中维护。

那么发生了什么,我该如何访问已保存的属性?

【问题讨论】:

    标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    您的对象没有任何问题,我认为您可能在这里误解了“故障”的含义。

    来自 Apple 的文档:

    “故障是 Core Data 用来减少你的 应用程序的内存使用..."

    一旦您尝试访问对象的任何属性,它将访问数据库以获取该对象的所有属性。

    更多详情在这里http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

    【讨论】:

      【解决方案2】:

      Faults 是 CoreData 与其他实体的松散链接的方式。只需通过属性或 valueGorKey 访问值,您就会看到它们及时填充。

      【讨论】:

        【解决方案3】:

        我有点晚了,但我发现我的程序中的某些步骤出现了问题。我没有删除数据库内容(我现在每次启动时都会这样做),然后创建和添加此实体,而是创建并添加了实体,然后删除了数据库内容。

        指向 favoritesCollection 实体的指针在程序的整个生命周期内都会保留,所以我希望它能够在创建后的任何时间看到它的内容。

        来自核心数据编程指南

        故障处理是透明的——您不必执行获取 意识到一个错误。如果在某个阶段存在故障的持久属性 对象被访问,然后 Core Data 自动检索数据 对象并初始化对象(参见 NSManagedObject 类 参考不导致故障触发的方法列表)。 这个过程通常被称为触发故障。

        Core Data 会在必要时自动触发故障(当一个持久的 访问故障的属性)。

        从我通过阅读编程指南可以看出,在查看任何特定实体时,看到关系(到其他实体的链接)的错误是正常的。但是没有提到看到持久属性值的错误。我相信,一般来说,如果对象在内存中,那么它的属性不应该出错,但它的关系可能会出错。

        favoritesCollection 实体完全出现故障(属性和关系)并且故障未得到解决这一事实表明存在问题。在这种情况下,它与数据库中不再存在的实体是一致的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多