getAllDocumentsFromCoreData

getAllDocumentsFromCoreData

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

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

我究竟做错了什么?我是Core Data的新手,所以这可能是菜鸟的错误。

//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]);
}

}

最佳答案

发生这种情况是因为:


托管对象没有对其托管对象上下文的强引用
释放托管对象上下文后,从其获取的所有托管对象都将变得不可访问,并且属性值设置为nil,因为它们不再与持久性存储建立任何连接。


在您的情况下,您要在getAllDocumentsFromCoreData中分配托管对象上下文并执行提取。您返回结果,但上下文在函数末尾被释放。当您查看返回的数组时,上下文已经消失,对象已无用。

您应该在其他地方创建托管对象上下文-可能(尽管不是必须)作为这些方法所在的对象的属性。通常具有相对较长的上下文对象,而不是仅在执行提取之前在本地创建它们。还有许多其他技术,但是您要注意的关键是,在完成从上下文中获取的所有内容之前,请勿释放上下文。

09-25 21:20