在appdelegate中访问的同一数据库与视图控制器之间的一致性

时间:2013-02-13 14:22:46

标签: ios core-data nsmanagedobjectcontext save uimanageddocument

我最近一直在使用Core Data和UIManagedDocument,并且有一些问题。

我有一个UITableViewController,我打开一个UIManagedDocument。在这里,我将信息下载到tableViewCotroller并将信息保存到数据库并更新tableview。现在当我通过主页按钮进入主屏幕然后再次打开应用程序时,我想在appdelegate中处理数据库中的数据。因此,在appdelegate中的相应方法中,我打开数据库,获取我想要的实体并更改我想要的对象中的属性。现在,这工作,我设法打开数据库并从数据库中获取我想要的对象。

当我在appdelegate中更改数据库中的数据时,我的问题就出现了。因为appdelegate方法完成后,我尝试从同一个数据库中重新获取tableview中的数据,但此时数据库尚未注册在appdelegate中调用的方法中所做的更改。我已经尝试在appdelegate内部进行更改之后立即调用saveToURL来覆盖UIManagedDocument上的方法,并且我还尝试了managedobjectcontext上的save:方法。 保存更改以正确更新数据库的正确方法是什么?

Ps:我在iPad上写这个,所以我设法上传代码,我稍后会上传。

谢谢

1 个答案:

答案 0 :(得分:0)

这是正确的方法 - 在NSManagedObjectContext中进行更改然后保存。请记住saveToURL是异步的,因此最有可能的问题是,在表视图中执行提取时,保存尚未完成。这就是完成块的用武之地。所以也许你可以让你的表视图中的完成块设置一个属性,这会导致你的fetch发生。像

这样的东西
// appdelegate
[self.mainDatabase saveToURL:self.mainDatabase.fileURL
            forSaveOperation:UIDocumentSaveForOverwriting
           completionHandler:^(BOOL success) {
               if (success) {
                   myTableView.context = self.mainDatabase.managedObjectContext;
                }
           }];

// TableView
- (void)setContext:(NSManagedObjectContext *)newContext {
_context = newContext;
NSArray *fetchResults = [_context executeFetchRequest:someFetchRequest error:&error];
// update model etc.
}