检索NSManagedObjects问题(核心数据)

时间:2015-12-14 05:11:01

标签: ios objective-c core-data

这是我的问题,我使用核心数据来存储大约58个文档。它们只有4个NSString属性。我有一个帮助器类,它设置为在需要时检索文档,但是当我从初始的getAllDocumentsFromCoreData传回数组时,在downloadDocumentPDFsAndStoreOnDeviceViaWebService中访问时,所有属性似乎都为null。

奇怪的是,当我在getAllDocumentsFromCoreData方法中查看从核心数据中获取的数组时,它会显示正确获取的所有文档/属性。

我做错了什么?我对核心数据相对较新,所以这可能是一个新手的错误。

//USE TO RETRIEVE ALL DOCUMENTS CURRENTLY STORED WITHIN COREDATA
+ (NSArray *) getAllDocumentsFromCoreData
{
CoreData_Helper *helper = [[CoreData_Helper alloc] init];
NSManagedObjectContext *context = [helper managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setReturnsObjectsAsFaults: NO];

NSEntityDescription *entity = [NSEntityDescription entityForName: @"Document" inManagedObjectContext: context];
[fetchRequest setEntity: entity];

NSError *error = nil;
NSArray *fetchedDocuments = [context executeFetchRequest: fetchRequest error: &error];

if (error)
{
    NSLog(@"%@", [error localizedDescription]);
}

return fetchedDocuments;
 }


+ (void) downloadDocumentPDFsAndStoreOnDeviceViaWebService
{
NSArray *fetchedDocuments = [CoreData_Helper getAllDocumentsFromCoreData];
for (Document *document in fetchedDocuments)
{
    NSLog(@"%@", [document fileID]);
}

}

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为:

  1. 托管对象没有对其托管对象上下文的强引用
  2. 当取消分配托管对象上下文时,从中获取的任何托管对象都将变得不可访问,属性值设置为nil,因为它们不再与持久性存储有任何连接。
  3. 在您的情况下,您需要在getAllDocumentsFromCoreData中分配托管对象上下文并执行提取。您返回结果,但在函数末尾取消分配上下文。当你查看返回的数组时,上下文消失了,对象也没用了。

    您应该在其他地方创建托管对象上下文 - 可能(但不一定)作为存在这些方法的对象的属性。具有相对长寿的上下文对象是典型的,而不是在执行获取之前在本地创建它们。还有其他各种技巧,但在你的情况下,关键在于,在你完成从中获取的所有内容之前,不要让上下文被释放。