当应用程序从后台恢复时,核心数据实体会消失

时间:2012-07-30 20:59:39

标签: ios core-data

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

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

我有多个使用Core Data的视图,但其中一些工作正常。我想知道为什么对于某些视图控制器,当应用程序返回前台时,我的Core Data对象设置为@property时会消失。

谢谢!

2 个答案:

答案 0 :(得分:1)

第一个建议:你应该使用NSFetchedResultsController而不是数组。除了许多其他优点之外,这样做效率更高,并且会为您考虑所有内存注意事项。事实上,它专门用于管理基于Core Data的表视图的datasource

如果您仍想使用阵列,我推测您未能正确初始化

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

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

现在数组应该保持不变。

答案 1 :(得分:0)

我想我弄清楚我的代码有什么问题。所以这就是我为获取核心数据所做的工作:

[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];
}];

这正确地获取结果,但问题是,虽然我认为我保留了核心数据对象,但它们实际上属于UIManagedDocumentContext,我没有保留它。因此,当应用程序返回到前台时,上下文消失,核心数据对象变为零。

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