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

Posted

技术标签:

【中文标题】在 appdelegate 和视图控制器中访问的同一数据库之间的一致性【英文标题】:Consistency between the same database accessed in the appdelegate and a view controller 【发布时间】:2013-02-13 14:22:46 【问题描述】:

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

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

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

Ps:我是在 iPad 上写的,所以没有上传代码,我稍后再上传。

谢谢

【问题讨论】:

【参考方案1】:

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

// 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.

【讨论】:

谢谢,但我有一个问题要问你。我的 tableViewCotroller 有一个包含 UIManagedDocument 的属性,它与我在 appdelegate 中访问的 UImanagedDocument 相同。表视图中的 manageddocument.managedobjectcontext 在 appdelegate 中更新和保存时不会自动更新吗? 如果 tableview 中的提取发生在 appDelegate 中所做的更改被保存之前,那么您将查询处于更新前状态的数据库。设置完成块的 tableview 的哪个属性并不重要(重点不是更新你的 tableview 上下文),只需让你设置的属性的设置器调用 fetch,因为到那时数据库会更新

以上是关于在 appdelegate 和视图控制器中访问的同一数据库之间的一致性的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDelegate 访问 View Controller 的属性

引用 AppDelegate 时出错

使用 App Delegate 访问通过 Storyboard 创建的视图控制器

从 AppDelegate 访问在故事板的 tableview 中创建的视图?

如何从app delegate访问NSViewController?

从 AppDelegate 呈现特定的视图控制器