iphone - 应用程序运行时替换 Core Data sqlite 文件,数据不更新

标签 iphone ios sqlite core-data

我正在为我的应用程序开发一个备份/恢复系统,用户可以在其中下载核心数据存储(sqlite 文件)的备份版本,并用下载的文件替换当前使用的数据存储。然而,一旦用户下载了文件并替换了当前的数据存储,所有数据似乎都没有更新。但是当应用程序退出并重新启动时,恢复的数据可用。如何强制我的应用程序重新加载核心数据存储的文件?

我已经尝试从我的 UIViewController 访问应用程序委托(delegate)来恢复数据,就像这样,以重建核心数据堆栈并将其传播到导航堆栈中的所有 View Controller :

MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
app.managedObjectContext = nil;
app.persistentStoreCoordinator = nil;
app.managedObjectModel = nil;
managedObjectContext = [app managedObjectContext];

NSArray *controllers = [self.navigationController viewControllers];
UIViewController *c;
for (int i = 0; i < [controllers count]; i++) {
    c = [controllers objectAtIndex:i];
    [c setManagedObjectContext:managedObjectContext];
}

但这不起作用,当我返回到 Root View Controller 时它只会抛出以下错误:'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

有谁知道如何强制应用重新加载数据并开始使用新的数据存储文件?

最佳答案

我认为让您感到困惑的是,即使您可以将所有托管对象上下文、存储协调器等设置为 nil,您仍然必须完全重新创建 使用中的每个托管对象都基于这些对象。

你最好的选择是做你现在正在做的事情,但也要找到一种方法来销毁你使用过的每个核心数据对象。也许您可以将各种 View Controller 弹出到根目录并从头开始重新加载该 Controller ,以便它使用您的新核心数据堆栈?您将失去一定程度的用户友好性(因为他们将不得不使用您加载的新数据重建 View Controller 堆栈),但您可以确定您已经销毁了所需的一切。

关于iphone - 应用程序运行时替换 Core Data sqlite 文件,数据不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374633/

相关文章:

ios - 如何从 DetailViewController 重新加载 MasterView Controller TableView

python - 使用参数 'LIKE' 搜索日期

iphone - 使用AudioToolKit的简单音效循环

iphone - Android 中的自定义 map ,通过图 block 加载(替代 RouteMe for iPhone SDK)

iphone - 使用 UIScrollView 生成问题

ios - 如何从 UIMenuController 中删除默认菜单项?

iphone - 如何拍摄静止图像?

ios - Spritekit 物理实体与错误的实体碰撞

java - 单个 mangedQuery 扫描多个文件夹中的音频文件

android - Android Studio 中连接两列并更新到另一列的正确语法是什么