将 Core Data 数据库从一个应用程序迁移到另一个应用程序

约恩

我有一个 Core Data 数据库,我希望预先填充它,而不必在首次启动时加载所有数据。我试图通过创建第二个应用程序来完成此操作,该应用程序负责加载并将 SQL 数据库从该应用程序复制到新应用程序。最初,我尝试简单地.sqlite从第二个应用程序复制文件,然后将文件复制到第一个应用程序中,如下所示:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "GeoPointDB")

    let seededData: String = "GeoPointDB"
    var persistentStoreDescriptions: NSPersistentStoreDescription

    let storeUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!

    if !FileManager.default.fileExists(atPath: (storeUrl.path)) {
        let seededDataUrl = Bundle.main.url(forResource: seededData, withExtension: "sqlite")
        try! FileManager.default.copyItem(at: seededDataUrl!, to: storeUrl)

    }

    container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeUrl)]
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error {

            fatalError("Unresolved error \(error),")
        }
    })

    return container

}()

但是,这给了我一条错误消息,指出“无法打开数据库文件”。研究了一下我发现了这篇文章:https : //developer.apple.com/library/content/qa/qa1809/_index.html

因此,我回到第二个应用程序并尝试使用以下代码正确导出数据库:

let documents = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!   
                do {
                    try context.persistentStoreCoordinator!.migratePersistentStore(context.persistentStoreCoordinator!.persistentStores.first!, to: documents, options: nil, withType: NSSQLiteStoreType)
                    print("Managed to save database file")
                } catch let error as NSError {
                    print("Failed to save DB: \(error)")
                }

但是当我这样做时,我在导出时遇到与尝试将复制的数据库加载到第一个应用程序时完全相同的错误:“无法打开数据库文件”。关于我做错了什么或如何使用 iOS 10/11 和 Swift 3/4 执行数据库迁移的任何提示?

一些可能有用的附加信息:

  • 这两个应用程序都具有来自 Xcode 项目创建时“使用核心数据”选项的标准 CoreData 代码
  • .xcdatamodeld一个app中的CoreData模型(文件)是从第二个app复制过来的,保证没有不一致
  • 我可以毫无问题地从第二个应用程序的数据库中添加和获取数据
约恩

最后我设法找到了一个可行的解决方案。我仍然没有弄清楚如何成功导出数据库,但由于我只会为每次应用更新(或频率较低)执行一次迁移,我可以手动复制数据并验证数据库没有损坏,只需在此之前对其进行测试提交到 App Store。

关于导入数据库的代码,这是我最终使用的:

lazy var persistentContainer: NSPersistentContainer = {
        let databaseName = "GeoPointDB"

        let container = NSPersistentContainer(name: databaseName)

        var persistentStoreDescriptions: NSPersistentStoreDescription

        let storeUrl = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!.appendingPathComponent(databaseName + ".sqlite")
        let storeUrlFolder = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first!

        if !FileManager.default.fileExists(atPath: (storeUrl.path)) {
            let seededDataUrl = Bundle.main.url(forResource: databaseName, withExtension: "sqlite")
            let seededDataUrl2 = Bundle.main.url(forResource: databaseName, withExtension: "sqlite-shm")
            let seededDataUrl3 = Bundle.main.url(forResource: databaseName, withExtension: "sqlite-wal")

            try! FileManager.default.copyItem(at: seededDataUrl!, to: storeUrl)
            try! FileManager.default.copyItem(at: seededDataUrl2!, to: storeUrlFolder.appendingPathComponent(databaseName + ".sqlite-shm"))
            try! FileManager.default.copyItem(at: seededDataUrl3!, to: storeUrlFolder.appendingPathComponent(databaseName + ".sqlite-wal"))

        }

        container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeUrl)]
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error {

                fatalError("Unresolved error \(error),")
            }
        })

        return container
    }()

我本质上改变的两件事是确保NSPersistantStoreDescription直接指向 SQL 文件(而不是上面的目录),并且我将所有三个文件(.sqlite,.sqlite-shm.sqlite-wal复制到文档文件夹。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将iOS应用程序从一个开发者帐户迁移到另一个?

来自分类Dev

使用一个Django应用程序将模型迁移到其他多个应用程序

来自分类Dev

可以在一个应用程序内使用多个Core Data模型吗?

来自分类Dev

将Core Data / SQLite数据库下载到应用程序中?

来自分类Dev

将数据从一页传输到另一个Windows 8 Phone应用程序

来自分类Dev

将应用程序从一个Facebook开发者帐户转移到另一个Facebook开发者帐户

来自分类Dev

将应用程序从一个Admob帐户转移到另一个帐户

来自分类Dev

Rails 4-将数据库列从一个应用程序移动到另一个

来自分类Dev

将数据从一个Java应用程序发送到另一个

来自分类Dev

使用onActivityResult将数据从一个应用程序传递到另一个应用程序

来自分类Dev

将Web流量从一个Azure Web应用程序转移到另一个Azure Web应用程序,而无需停机

来自分类Dev

Firebase将数据库从一个Android应用程序传输或复制到另一个Android应用程序

来自分类Dev

如何使用Android应用程序从sqlite中的assest文件夹将表从一个数据库复制到另一个数据库

来自分类Dev

将C#Forms应用程序注入另一个应用程序

来自分类Dev

将应用程序的命运绑定到另一个应用程序Android

来自分类Dev

可以在一个应用程序内使用多个Core Data模型吗?

来自分类Dev

将Android活动从一个应用程序复制到另一个应用程序

来自分类Dev

将值从Windows应用程序传递给另一个应用程序

来自分类Dev

将一个应用程序连接到另一个应用程序的数据库时出错

来自分类Dev

无法将文件从一个应用程序导入到另一个

来自分类Dev

将值从一个活动传递到另一个aondroid应用程序时崩溃了

来自分类Dev

从 Android 应用程序的操作栏中选择菜单选项时,将数据从一个活动传递到另一个活动

来自分类Dev

将一个 Android 应用程序导入另一个应用程序

来自分类Dev

Django 将 ImageFiles 从一个应用程序迁移到另一个应用程序

来自分类Dev

如何将数据从一个应用程序传递到 ionic 3 中的另一个应用程序?

来自分类Dev

如何在单页应用程序中以角度将数据从一个页面传递到另一个页面

来自分类Dev

将数据从一个应用程序发送到另一个应用程序中的特定活动

来自分类Dev

通过 URL Scheme 将数据从一个应用程序传递到另一个应用程序?

来自分类Dev

django 2.2.5 将 url 从一个应用程序导入到另一个应用程序

Related 相关文章

  1. 1

    如何将iOS应用程序从一个开发者帐户迁移到另一个?

  2. 2

    使用一个Django应用程序将模型迁移到其他多个应用程序

  3. 3

    可以在一个应用程序内使用多个Core Data模型吗?

  4. 4

    将Core Data / SQLite数据库下载到应用程序中?

  5. 5

    将数据从一页传输到另一个Windows 8 Phone应用程序

  6. 6

    将应用程序从一个Facebook开发者帐户转移到另一个Facebook开发者帐户

  7. 7

    将应用程序从一个Admob帐户转移到另一个帐户

  8. 8

    Rails 4-将数据库列从一个应用程序移动到另一个

  9. 9

    将数据从一个Java应用程序发送到另一个

  10. 10

    使用onActivityResult将数据从一个应用程序传递到另一个应用程序

  11. 11

    将Web流量从一个Azure Web应用程序转移到另一个Azure Web应用程序,而无需停机

  12. 12

    Firebase将数据库从一个Android应用程序传输或复制到另一个Android应用程序

  13. 13

    如何使用Android应用程序从sqlite中的assest文件夹将表从一个数据库复制到另一个数据库

  14. 14

    将C#Forms应用程序注入另一个应用程序

  15. 15

    将应用程序的命运绑定到另一个应用程序Android

  16. 16

    可以在一个应用程序内使用多个Core Data模型吗?

  17. 17

    将Android活动从一个应用程序复制到另一个应用程序

  18. 18

    将值从Windows应用程序传递给另一个应用程序

  19. 19

    将一个应用程序连接到另一个应用程序的数据库时出错

  20. 20

    无法将文件从一个应用程序导入到另一个

  21. 21

    将值从一个活动传递到另一个aondroid应用程序时崩溃了

  22. 22

    从 Android 应用程序的操作栏中选择菜单选项时,将数据从一个活动传递到另一个活动

  23. 23

    将一个 Android 应用程序导入另一个应用程序

  24. 24

    Django 将 ImageFiles 从一个应用程序迁移到另一个应用程序

  25. 25

    如何将数据从一个应用程序传递到 ionic 3 中的另一个应用程序?

  26. 26

    如何在单页应用程序中以角度将数据从一个页面传递到另一个页面

  27. 27

    将数据从一个应用程序发送到另一个应用程序中的特定活动

  28. 28

    通过 URL Scheme 将数据从一个应用程序传递到另一个应用程序?

  29. 29

    django 2.2.5 将 url 从一个应用程序导入到另一个应用程序

热门标签

归档