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

Posted

技术标签:

【中文标题】为啥应用程序找不到我恢复的核心数据文件?【英文标题】:Why is my restore of the Core Data files not found by app?为什么应用程序找不到我恢复的核心数据文件? 【发布时间】:2015-02-03 18:39:25 【问题描述】:

更新:我正在尝试备份和恢复我的核心数据文件(使用基于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-wal

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

[MagicalRecord cleanUp];  //  disable Core Data

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

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

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

【问题讨论】:

当您清理并随后恢复 Core Data 堆栈时,您如何让您的 UI 知道它? 我刚刚进行了另一个测试; sqlite 文件中有数据,它们只是没有正确恢复(我检查了 Finder 中的文件,使用 SQLite 浏览器查看内容,并在运行应用程序时根据控制台日志验证了文件名,它们是相同的!。 )..无论我重启应用多少次,应用中都没有显示数据...很奇怪! 【参考方案1】:

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

【讨论】:

以上是关于为啥应用程序找不到我恢复的核心数据文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打开程序是总是显示“找不到所需的.DLL文件”

ASP.NET - 为啥会突然找不到数据库文件?

备份和恢复 Core Data SQLite(核心数据)

我使用 NSPersistentStoreCoordinator 创建了一个文件,但在应用重启后找不到它

Finder 找不到文件夹消息:为啥?

分区找不到的数据找回方法