为什么应用程序找不到我的Core Data文件还原?

时间:2015-02-03 18:39:25

标签: objective-c core-data ios8.1 magicalrecord-2.2

更新:我正在尝试备份和恢复我的核心数据文件(使用基于issue #444的日记和MagicalRecord)。在iOS模拟器下运行时,我知道每次从应用程序的上次执行开始都会移动文件。 Here是完整的代码(我把它放在这里,因为它是长度的,现在它的格式化和语法突出显示,使其更容易阅读)。

我可以在应用程序启动时找到新位置,检索我存储的文件并从Documents目录中的文件进行恢复,将它们放置在NSLog语句的控制台输出确定的正确新位置(它不是显示正在恢复的-shm文件,但它位于同一位置)。

  

AppDelegate-sqliteFilePath:/ Users / rolfmarsh / Library / Developer / CoreSimulator / Devices / 1EE69744-255A-45CD-88F1-63FEAD117B32 / data / Containers / Data / Application / B424CA1A-D41C-488D-A7E9-0F13CB2244B3 / Library /应用程序支持/ SalonBook

     

SVC-sqliteFilePath:/ Users / rolfmarsh / Library / Developer / CoreSimulator / Devices / 1EE69744-255A-45CD-88F1-63FEAD117B32 / data / Containers / Data / Application / B424CA1A-D41C-488D-A7E9-0F13CB2244B3 / Library /应用程序支持/ SalonBook

     

documentsBasePath:/ Users / rolfmarsh / Library / Developer / CoreSimulator / Devices / 1EE69744-255A-45CD-88F1-63FEAD117B32 / data / Containers / Data / Application / B424CA1A-D41C-488D-A7E9-0F13CB2244B3 / Documents

     

起始 - storePath:/ Users / rolfmarsh / Library / Developer / CoreSimulator / Devices / 1EE69744-255A-45CD-88F1-63FEAD117B32 / data / Containers / Data / Application / B424CA1A-D41C-488D-A7E9-0F13CB2244B3 / Library /应用程序支持/ SalonBook / saori.sqlite

     

完成! storePath:/ Users / rolfmarsh / Library / Developer / CoreSimulator / Devices / 1EE69744-255A-45CD-88F1-63FEAD117B32 / data / Containers / Data / Application / B424CA1A-D41C-488D-A7E9-0F13CB2244B3 / Library / Application Support / SalonBook / saori.sqlite-沃尔玛

当我开始恢复时,我发出:

[MagicalRecord cleanUp];  //  disable Core Data

完成还原后,我发出以下命令:

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"saori.sqlite"];  //  enable Core Data migration
defaultContext = [NSManagedObjectContext MR_defaultContext];   //  set default NSManagedObjectContext for MagicalRecord

当我查看Core Data存储中应该的记录(使用SQLite浏览器)时,他们 在sqlite文件(saori.sqlite)中但是他们不要出现在应用程序中!这就像MR堆栈没有正确设置或默认上下文以某种方式被破坏。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

好的,所以在有点刺激和捅了之后,我相信+[MagicalRecord cleanUp]需要一些爱。基本上,持久性存储协调器在没有首先删除SQLite持久性存储的情况下被释放。

正如您在另一个关于此问题的对话中所述,您需要重置托管对象上下文:

[[NSManagedObjectContext MR_defaultContext] reset];

然后遍历所有持久性存储以删除它们:

NSError *error;
NSPersistentStoreCoordinator *persistentStoreCoordinator = [NSPersistentStoreCoordinator MR_defaultStoreCoordinator];
for (NSPersistentStore *store in [persistentStoreCoordinator persistentStores]) {
    BOOL removed = [persistentStoreCoordinator removePersistentStore:store error:&error];

    if (!removed) {
        NSLog(@"Couldn't remove persistent store: %@", error);
    }
}

之后,调用[MagicalRecord cleanUp],然后恢复整个堆栈应该是安全的(尽管您可以选择将更新的持久存储附加到协调器而不是完全吹掉所有内容)