NSManagedObject故障

时间:2011-09-25 23:12:31

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我有一个NSManagedObject,它在程序开始时初始化了一些属性。当我稍后引用此对象时,它似乎出现故障,并且无法访问这些属性。我不确定我需要做什么。

这与添加到程序中的新功能有关,该功能已通过其他所有方式顺利运行核心数据。

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

    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,在单例中维护。

那么发生了什么,以及如何获取已保存的属性?

3 个答案:

答案 0 :(得分:1)

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

来自Apple的文档:

  

“故障是核心数据用来减少你的机制的一种机制   应用程序的内存使用情况......“

尝试访问任何对象的属性后,它将在数据库中找到所有对象的属性。

此处有更多详情http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我回到这里有点晚了,但我发现程序中的一些步骤出了故障。我没有删除数据库内容(我现在在启动时做的事情,然后创建和添加这个实体),而是创建并添加了实体,然后删除了数据库内容。

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

来自核心数据编程指南

  

故障处理是透明的 - 您不必执行提取   实现了一个错误。如果在某个阶段出现故障的持久性   访问对象,然后Core Data自动检索数据   对象并初始化对象(请参阅NSManagedObject类   引用不会导致错误的方法列表)。   这个过程通常被称为触发故障。

     

核心数据会在必要时自动触发故障(持久性故障时)   访问过错的属性。)

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

favoritesCollection实体完全出错(属性和关系)并且故障没有得到解决的事实揭示了一个问题。在这种情况下,它与数据库中不再存在的实体一致。