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

时间:2010-07-30 19:13:38

标签: iphone ios sqlite core-data

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

我试图从我的UIViewController访问app delegate,它恢复数据,就像这样,重建核心数据堆栈并在导航堆栈中的所有视图控制器中传播它:

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

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

1 个答案:

答案 0 :(得分:1)

我认为绊倒你的事实是,即使您可以将所有托管对象上下文,商店协调员等设置为nil,您仍然必须完全重新创建使用的每个托管对象都基于这些对象。

您最好的选择是执行您现在正在执行的操作,同时还要找到一种方法来销毁您使用过的每个Core Data对象。也许您可以将各种视图控制器弹出到根目录并从头开始重新加载该控制器,以便它使用新的Core Data堆栈?您将失去一定的用户友好性(因为他们必须使用您加载的新数据重建视图控制器堆栈),但您将确保已经销毁了所需的一切。< / p>