在Core Data

时间:2018-01-23 14:52:38

标签: ios swift sqlite core-data

我正在尝试制作当前Core Data数据库文件的副本。

在做了一些研究之后,我发现migratePersistentStore(_:to:options:withType:)可能在这种情况下很有用,正如Apple documentation所说,

  

此方法通常用于“另存为”操作。

虽然文件也说,

  

重要

     

调用此方法后,将从协调器中删除指定的存储,因此存储不再是有用的引用。

因此,我尝试保留原始商店参考,以便应用可以继续工作。

受到this thread的启发,我遵循了Tom Harrington的想法:

  
      
  1. 创建新的仅迁移NSPersistentStoreCoordinator并添加原始持久性存储文件。
  2.   
  3. 使用此新PSC迁移到新文件URL。
  4.   
  5. 删除对此新PSC的所有引用,不要将其用于其他任何内容。
  6.   

这是我的代码,用于使用UIActivityViewController共享备份sqlite文件:

func shareDatabase() {
        let backupFileName = "Backup.sqlite"
        let backupFilePath = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Library").appendingPathComponent("Application Support").appendingPathComponent(backupFileName)
        let mainDataPSC = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.persistentStoreCoordinator
        let migratePSC = NSPersistentStoreCoordinator(managedObjectModel: mainDataPSC.managedObjectModel)
        let origStore = mainDataPSC.persistentStores.first!

        try! migratePSC.migratePersistentStore(origStore, to: backupFilePath, options: [NSSQLitePragmasOption: ["journal_mode": "DELETE"]], withType: NSSQLiteStoreType)

        let activityVC = UIActivityViewController(activityItems: [backupFilePath], applicationActivities: nil)
        present(activityVC, animated: true, completion: nil)
    }

不幸的是,迁移后它仍然失去对原始商店的引用,之后app无法正常工作。

这是制作sqlite文件副本的正确方法吗? 我如何保留原始参考文献?

谢谢大家!

1 个答案:

答案 0 :(得分:0)

你在其他答案中没有做我的意思,但公平地说,我可能没有像我应该的那样清楚地解释它。您遇到此问题是因为您仍然正在迁移origStore,因此它仍然会被删除,但仍然无效。使用新协调器是不够的 - 您必须确保单独保留现有的Core Data堆栈。

对该过程的更全面的描述是:

  1. 创建一个新的NSPersistentStoreCoordinator - 您已经在做的事。
  2. 使用migratePSC将持久性商店文件添加到协调员(您的addPersistentStore(ofType:configurationName:at:options:))。此函数返回NSPersistentStore对象。
  3. 使用新协调员(migratePSC)将新的持久性存储从步骤2迁移到新位置(backupFilePath)。
  4. 在此之后,步骤2中的持久性商店将无效,但您并未在其他任何地方使用它,因此无关紧要。同时,您现有的NSPersistentContainer及其所有属性都不会受到影响,您的应用仍可继续使用。