将核心数据数据库从一个应用程序迁移到另一个应用程序

2023-11-30

我有一个核心数据数据库,我希望预先填充该数据库,而不必在首次启动时加载所有数据。我试图通过创建第二个应用程序来实现这一点,该应用程序负责加载并将 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“使用核心数据”选项的标准核心数据代码
  • 核心数据模型(.xcdatamodeld第一个应用程序中的文件)是从第二个应用程序复制的,以确保不存在不一致
  • 我可以毫无问题地从第二个应用程序的数据库添加和获取数据

最终我设法找到了一个可行的解决方案。我仍然不知道如何成功导出数据库,但由于我只会为每个应用程序更新(或不太频繁)执行此迁移一次,因此我可以手动复制数据并通过简单地在之前进行测试来验证数据库没有损坏提交到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 and .sqlite-wal) 到文档文件夹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将核心数据数据库从一个应用程序迁移到另一个应用程序 的相关文章

  • 在 Swift 中有条件导入基于 iOS 版本的框架(如 Speech)?

    有没有办法有条件地导入框架Swift基于运行时 iOS 版本 特别是 我有一个部署目标为的应用程序iOS 8 我想使用新的Apple Speech应用程序中的框架 如果在运行时可用 我知道 available iOS 10 代码部分的指令
  • iOS 9.3 中的 KVO 被破坏

    这可能是 iOS 9 3 发行版 中的一个可怕的错误 添加单个观察者时 NSUserDefaults standardUserDefaults 我注意到响应方法 observeValueForKeyPath ofObject change
  • React Native Detox:无法接受系统警报弹出的位置权限

    使用以下命令从命令行启动应用程序detox test configuration ios sim debug 通过代码启动应用程序await device launchApp permissions location always noti
  • 寻找可靠的方法来选择iPhone 13微距相机设备

    我正在使用 objc 开发一个应用程序 我必须选择 iPhone 13 Pro 和 13 Pro Max 中配备的新微距摄像头 目前 我在所有其他设备上选择我的相机 并剪掉此代码 AVCaptureDeviceDiscoverySessio
  • 如何在注销并重新登录后保存按钮状态?

    我有一个保存按钮 点击该按钮后 会将标签 quoteLabel 中的文本保存到 Firebase 中的用户帐户 然后该按钮将隐藏 并且取消保存按钮将不再隐藏 以便用户可以根据需要取消保存 这两个按钮都可以根据需要发布和删除数据 但是 如果我
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

    我有一个带有UITableView 我允许通过滑动来编辑 删除 的行 就像在邮件应用程序中一样 我用以下方法来做到这一点 BOOL tableView UITableView tableView canEditRowAtIndexPath
  • 如何将 RGB 值转换为十六进制字符串 iOS swift

    我想将 RGB 值转换为十六进制字符串 我将十六进制转换为 RGB 如下所示 但反之亦然 func hexStringToRGB hexString String gt red CGFloat green CGFloat blue CGFl
  • 我的 iPhone 6 获取 iPhone 5 媒体查询

    我不明白这里发生了什么事 我在 CSS 媒体查询中专门针对 iphone 5 media only screen and min device width 320px and max device width 568px some div
  • 如何获得 UICollectionView 的矩形

    我想在 UICollectionView 中找到节标题的框架 我对 UITableView 也有类似的情况 为此 我能够通过执行以下操作来获得其正确性 CGRect rect self tableView rectForHeaderInSe
  • 在 Swift 中计算两个 CLLocation 点之间的方位角 [重复]

    这个问题在这里已经有答案了 我正在尝试计算仅 swift 代码中两个 CLLocation 点之间的方位 我遇到了一些困难 并假设这是一个非常简单的函数 堆栈溢出似乎没有列出任何内容 func d2r degrees Double gt D
  • 辅助功能标识符在 iOS 模拟器的辅助功能检查器中不可见

    我想使用辅助功能检查器来验证在模拟器 iOS 9 2 中运行的应用程序中的所有辅助功能标识符 辅助功能检查器能够返回多个辅助功能字段 但不能返回标识符 知道为什么以及如何我能看到它们吗 实际上有一种方法 克里斯 普林斯 Chris Prin
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • 出现错误:FT_Open_Face 失败:错误 2

    当我使用时出现以下错误CGContextDrawPDFPage context PDFPage 对于某些文件 有解决办法来解决这个问题吗 FT Open Face failed error 2 错误2看起来像errno2 这是 找不到文件
  • 为什么我收到 com.facebook.sdk.login 错误 308?

    我正在使用 Xcode 7 0 在 iOS 9 0 2 上进行测试并使用 Facebook SDK 4 7 0 当我登录用户时 大多数时候一切都正常 但有时我不断收到此错误 但我不知道为什么 操作无法完成 com facebook sdk
  • Xcode 中的 Prefix.pch 文件是什么?

    许多开发人员正在向其中添加各种方便的宏Prefix pch 但我的问题是那是什么Prefix pch file 如果我删除它Prefix pch来自我的文件Xcode 那么我的应用程序会运行吗 或者会显示什么错误吗 或者它会在构建过程中崩溃
  • 在启动屏幕中执行代码已更新

    在原始启动屏幕中执行代码 https stackoverflow com questions 27642016 execute code in launch screen 现在默认的LaunchScreenXcode 项目中的文件已更改为
  • 如何在 Swift 中将所有 iOS 设备的标签水平居中

    我不知道如何使标签在图像视图中水平居中 标签说 You ve been here What would you rate us 我想要What would you rate us属于 You ve been here 我试图完成此操作的方法

随机推荐

  • 如何编写降序排序键函数?

    最近版本的 Python 中传递一个key功能为sort 从上一个cmp函数使我对某些对象执行复杂的排序变得更加困难 例如 我想使用一组字符串决胜字段对一组对象从最新到最旧进行排序 所以我希望日期按相反顺序排列 但字符串按自然顺序排列 使用
  • 如何在 symfony 4 中公开 LoggerInterface 服务

    我希望有Psr Log LoggerInterface在 symfony 中 public 以便能够直接从容器中获取它 container gt get Psr Log LoggerInterface 我尝试了以下方法services ya
  • 使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手

    这是 的后续问题 使用自签名证书和 SSLEngine JSSE 进行 SSL 握手 我已经实现了一个 NIO Web 服务器 可以在同一端口上处理 SSL 和非 SSL 消息 为了区分 SSL 和非 SSL 消息 我检查入站请求的第一个字
  • 如何使用InputStream从ZIP读取文件?

    我必须使用 SFTP 从 ZIP 存档 只有一个文件 我知道它的名称 获取文件内容 我唯一拥有的是 ZIPInputStream 大多数示例显示如何使用此语句获取内容 ZipFile zipFile new ZipFile location
  • 使用委托将数据传递回先前的 VC 并更新自定义单元

    我正在尝试传递数据BACK到上一个viewController使用代表 有谁知道如何从ViewController B to ViewController A 所以我想传递数据SecondVC to FirstVC并使用来自的数据更新自定义
  • 为什么我的 @Autowired 对象为空?

    我有以下 JSF 托管 bean package com example import java io Serializable import javax faces bean ManagedBean import org springfr
  • 如何在iPhone应用程序中显示不同的自定义阿拉伯字体?

    在我的应用程序中 我需要使用不同的自定义字体显示阿拉伯语文本 我按照场景添加ttf文件到info plist 根据上面的场景 我成功获得了不同字体样式的显示文本ENGLISH纯文本 我正在做同样的事情arabic字体样式 但在这里我没有得到
  • 关于值类型装箱的混乱

    在下面的代码中 int i 5 object o 5 Console WriteLine o prints 5 我有三个问题 1 获得了哪些附加 有用的功能5驻留在变量中o那5由变量表示i不具有 2 如果某些代码需要值类型 那么我们可以将
  • 我的 CSS 不会链接到我的 HTML 文件

    我正在尝试在 Sublime Text Editor 2 中构建一个简单的网站 但是 我的 CSS 文件不会链接到我的 HTML 文件 因此不会打印纯文本 我的 HTML 代码是
  • Angularjs - 控制器继承与范围继承

    下面是使用范围继承的代码
  • 立即执行时出现无效字符错误

    BEGIN exception when others then sqltext2 insert into ERROR TABLE SHREE select str from dual EXECUTE IMMEDIATE sqltext2
  • 如何在 WPF MVVM 中将组合框与外键绑定

    我知道关于数据绑定组合框有很多问题 也有很多教程 但我觉得这些教程很难 所以 我问这个问题 假设我的数据库中有两个表 Customer CustomerID Name GenderID 性别类型 GenderTypeID GenderTyp
  • 跨浏览器脚本使我的网站成为主页[重复]

    这个问题在这里已经有答案了 我有一个网站 我想要求用户将我的网站设为主页 如果他们单击 是 我想运行一个脚本 使我的网站成为用户浏览器的主页 有一个类似的主题在这里和一个解决方案here 但是 我的后一个链接中提供的解决方案仅适用于 IE
  • 用于密码验证的正则表达式

    我目前使用这个正则表达式来检查字符串是否符合一些条件 条件是 字符串长度必须介于 8 到 15 个字符之间 字符串必须至少包含一个数字 字符串必须至少包含一个大写字母 字符串必须至少包含一个小写字母 0 9 a zA Z a zA Z0 9
  • 使用 Paramiko 设置 SSH 隧道来访问 PostgreSQL

    我目前使用 Paramiko 访问 SFTP 服务器并连接到同一服务器上的 PostgreSQL 我发现很多例子使用sshtunnel登录 PostgreSQL 但我不知道如何用纯Paramiko 做到这一点 目前我的代码看起来像这样 es
  • 红移。将逗号分隔的值转换为行

    我想知道如何将逗号分隔的值转换为 Redshift 中的行 我担心我自己的解决方案不是最佳的 请指教 我有一个表 其中一列具有逗号分隔的值 例如 I have user id user name user action 1 Shone st
  • 使用 Microsoft.Azure.Management.ServiceBus 获取队列消息计数

    我需要一个关于如何在服务总线队列上进行 CRUD 操作的示例 我实际上需要 Microsoft Azure Management ServiceBus SBQueue 类的实例 以便我可以计算该队列中的消息 较旧的方法是使用管理客户端 va
  • 如何在 MahApps.Metro 中创建自定义口音?

    我正在尝试覆盖弹出窗口的默认样式 我尝试将所有样式移动到自己的 ResourceDictionary 中并使用
  • C# 找出数组中最短和最长的单词

    我试图根据长度找到最短和最长的字符串值 但我被卡住了 截至目前 脚本在写入行之后退出 我认为代码需要一些帮助 我不认为 for 循环可以单独工作 任何援助将不胜感激 for int i 5 i lt 0 i string word new
  • 将核心数据数据库从一个应用程序迁移到另一个应用程序

    我有一个核心数据数据库 我希望预先填充该数据库 而不必在首次启动时加载所有数据 我试图通过创建第二个应用程序来实现这一点 该应用程序负责加载并将 SQL 数据库从该应用程序复制到新应用程序 最初我尝试简单地复制 sqlite从第二个应用程序