应用从后台恢复时核心数据实体消失

Posted

技术标签:

【中文标题】应用从后台恢复时核心数据实体消失【英文标题】:Core data entity disappears when app resumes from background 【发布时间】:2012-07-30 20:59:38 【问题描述】:

我有一个使用只读核心数据数据库的应用程序(这意味着我从不写入数据库)。我有一个视图控制器,它获取一些核心数据实体并将它们显示在表格中。例如,我有一个名为 Photo 的核心数据实体,而在我的视图控制器中,我有一个名为 @property (nonatomic, strong) NSArray *photos; 的照片对象列表。

现在,当应用重新启动时,一切正常。但是当我进入该视图并退出应用程序(所以它仍然在后台)并重新进入它时,我设置的@property 变成了nil。我仍然在屏幕上看到所有UITableViewCells。但是,当我尝试滚动时,应用程序崩溃了。

我有多个使用 Core Data 东西的视图,但其中一些工作得很好。我想知道为什么对于某些视图控制器,我设置为 @property 的核心数据对象在应用返回前台时消失了。

谢谢!

【问题讨论】:

更多信息...例如您的属性的代码,以及当您的控制器从应用程序和显示器卸载和重新加载时您会做什么。 【参考方案1】:

第一个建议:您应该使用 NSFetchedResultsController 而不是数组。除了许多其他优点外,这更有效,并且会为您处理所有内存问题。事实上,它是专门为管理基于Core Data的表视图的datasource而设计的。

如果您仍想使用您的数组,我推测您未能正确初始化它。

在您的viewDidLoad 方法中,不要只分配从核心数据中获取的结果,而是通过适当的初始化来完成:

self.photos = [[NSArray alloc] initWithArray:coreDataResults];

现在数组应该保持不变。

【讨论】:

是的 alloc init 它似乎工作。不过我不确定NSFetchedResultsController。它会保留UIManagedDocument吗? 它会保留它获取的结果,不管它们是什么。 好的。下次我会试试的。谢谢!【参考方案2】:

我想我知道我的代码出了什么问题。所以这就是我获取核心数据的方法:

[DatabaseHelper openDatabase:@"database" usingBlock:^(UIManagedDocument *document) 
     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shop"];
     request.predicate = [NSPredicate predicateWithFormat:@"ecategory = %@", self.category];
     NSError *error = nil;
     NSArray *matches = [document.managedObjectContext executeFetchRequest:request error:&error];
     self.shops = matches;
     [self updateTable];
];

这可以正确获取结果,但问题是,虽然我认为我保留了 Core Data 对象,但它们实际上属于 UIManagedDocumentContext,而我没有保留它。所以当应用返回前台时,上下文消失了,核心数据对象变为 nil。

所以我所做的是声明一个新属性:@property (nonatomic, strong) UIManagedDocument *database;,然后在块中设置self.database = document;。现在控制器将保留上下文,一切正常。

【讨论】:

以上是关于应用从后台恢复时核心数据实体消失的主要内容,如果未能解决你的问题,请参考以下文章

核心数据,关系消失

加载主 TableViewController 后,值从核心数据中消失

锚定到BottomAppBar的FloatingActionButton在应用程序恢复时消失

使用 NSFetchedResultsController 和核心数据移动时 UITableView 单元格消失

回到应用程序时,Android 后台活动消失

当应用程序在后台时,Finger Paint 自定义视图绘图消失