【问题标题】:Copy / Backup Persistent Store复制/备份持久存储
【发布时间】:2014-05-05 09:40:00
【问题描述】:

通常,当我为我的应用程序备份核心数据文件时,我只会在应用程序运行时将 .sqlite 文件复制到另一个位置。但是现在启用了日志(wal),这不再起作用了。我看不到 NSPersistentStoreCordinator 或 NSManagedObjectContext 写入新文件的方法。我猜也许我有两种方法:

    • 关闭持久存储并使用@{@"journal_mode" : @"DELETE"} 再次打开它,然后复制 .sqlite 文件。
  1. 添加另一个持久存储,并可能从原始 ps 复制到新的?

还有更好的主意吗? 谢谢。

【问题讨论】:

    标签: cocoa core-data nsfilemanager


    【解决方案1】:

    更改日志模式会消除日志文件,所以很简单。不过,我不知道我是否会信任它供您使用——因为不能保证 Core Data 实际上已经刷新了对 SQLite 文件的所有新更改。这可能没问题,但可能有一些 Core Data 尚未写出的内存更改。这几乎可以肯定是安全的,但它偶尔无法正常工作的可能性很小。

    选项 2 会更安全,但工作量更大。我将使用NSPersistentStoreCoordinatormigratePersistentStore:toURL:options:withType:error: 方法创建第二个持久存储(文档特别提到该方法对“另存为”操作很有用)。告诉 Core Data 为您创建副本应确保实际复制所有必要的内容。只是不要在您的主要持久存储协调器上执行此操作,因为迁移后,PSC 会删除对原始存储对象的引用(该文件仍然存在,但该 PSC 不再使用它)。步骤将是

    1. 创建一个新的 migrate-only NSPersistentStoreCoordinator 并添加您的原始持久存储文件。
    2. 使用这个新的 PSC 迁移到新的文件 URL。
    3. 删除对这个新 PSC 的所有引用,不要将其用于其他任何事情。

    【讨论】:

    • 选项 3 是否可以仅复制 SQLite 文件和相关的日志文件?日志文件与 sqlite 文件具有相同的文件名,但具有不同的路径扩展名。
    • 感谢您的回答。持久存储元数据怎么样?我发现在我的 *.sqlite 数据库在其他设备上恢复后我丢失了它。是真的还是我的错?
    • 元数据存储在 SQLite 文件的单独表中。您不需要采取任何特殊步骤来避免丢失它。但是,如果您丢失了对日志文件的跟踪,您可能会丢失各种数据,包括元数据。如果您以某种方式丢失了它,请发布一个问题,描述您正在做什么导致它丢失。
    • 如何从这个文件中恢复?
    • 恢复是反向备份,所以步骤是一样的。
    猜你喜欢
    • 2010-10-05
    • 2018-07-12
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多