在应用程序运行时replace核心数据sqlite文件,数据不会更新

我正在为我的应用程序开发备份/恢复系统,用户可以在其中下载核心数据存储(sqlite文件)的备份版本,并将当前使用的数据存储replace为下载的文件。 但是,一旦用户下载文件并replace当前的数据存储,则没有任何数据显示为已更新。 但是,当应用程序退出并重新启动,恢复的数据可用。 我如何强制我的应用程序重新加载核心数据存储的文件?

我尝试从我的UIViewController中访问应用程序委托来恢复数据,像这样,重build核心数据堆栈,并在导航堆栈中的所有视图控制器中传播:

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]; } 

但是这不起作用,当我回到根视图控制器时,它只会引发以下错误: 'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

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

我认为让你感到沮丧的是,尽pipe你可以设置所有的托pipe对象上下文,存储协调器等等,但是你仍然需要完全重新创build每一个基于这些对象的被pipe理对象。

你最好的办法是做你现在正在做的事情,同时也find一种方法来销毁你所使用的每一个核心数据对象。 也许你可以把你的各种视图控制器放到根目录下并从头开始重新加载该控制器,以便它使用新的核心数据堆栈? 你将失去一定的用户友好性(因为他们将不得不使用你已经加载的新数据重build视图控制器堆栈),但是你一定会摧毁你所需要的一切。