为什么应用程序找不到我恢复的核心数据文件?

Why is my restore of the Core Data files not found by app?

更新: 我正在尝试备份和恢复我的核心数据文件(使用基于 issue #444). When running under the iOS simulator, I know that the files are moved each time from the last execution of the app. Here 的日记和 MagicalRecord 是完整的代码(我把它放在这里是因为它很长,现在已格式化并突出显示语法,使其更易于阅读。

我可以在应用程序启动时找到新位置,检索我存储的文件并从 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/Application Support/SalonBook

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

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

starting - 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

Finished! 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-wal

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

[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 堆栈设置不正确或默认上下文以某种方式失效。知道如何解决这个问题吗?

好的,所以在经过一些刺激和探索之后,我相信 +[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] 应该是安全的,然后像以前一样恢复整个堆栈(尽管您可以选择将更新的持久存储附加到协调器而不是完全破坏所有内容离开)。