【问题标题】:Retrieving NSManagedObjects Issue (Core Data)检索 NSManagedObjects 问题(核心数据)
【发布时间】:2015-12-14 05:11:01
【问题描述】:

这是我的问题,我正在使用核心数据来存储大约 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]);
}

}

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    发生这种情况是因为:

    1. 托管对象没有对其托管对象上下文的强引用
    2. 当托管对象上下文被解除分配时,从其中获取的任何托管对象都变得不可访问,并且属性值设置为 nil,因为它们不再与持久存储有任何连接。

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

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

    【讨论】:

    • 感谢您的解释!实际上,我通过为存储我的 nsmanagedcontext 的对象创建一个单例来解决这个问题。它工作得很好。非常感谢!
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2015-05-20
    • 2011-07-03
    相关资源
    最近更新 更多