0

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

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

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

谢谢!

4

2 回答 2

1

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

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

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

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

现在数组应该持续存在。

于 2012-07-31T07:32:55.780 回答
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];
}];

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

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

于 2012-07-31T15:45:24.017 回答