我有一个使用只读Core Data数据库的应用程序(这意味着我从不写入数据库)。我有一个视图控制器,它获取一些核心数据实体并将它们显示在表中。例如,我有一个名为Photo
的核心数据实体,在我的视图控制器中,我说@property (nonatomic, strong) NSArray *photos;
,这是一个Photo对象列表。
现在,当应用程序启动时,一切正常。但是当我转到该视图并退出应用程序(因此它仍在后台)并重新输入时,我设置的@property
变为nil
。我仍然会在屏幕上看到所有UITableViewCell
。但是,当我尝试滚动时,应用程序崩溃了。
我有多个使用Core Data的视图,但其中一些工作正常。我想知道为什么对于某些视图控制器,当应用程序返回前台时,我的Core Data对象设置为@property
时会消失。
谢谢!
答案 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;
。现在控制器将保留上下文,一切正常。