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

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(使用前将#替换为@)

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

  • 从软件查找服务返回无效结果

    我尝试通过 XCode 组织者提交 iOS 应用程序 但在身份验证后失败 组织者说 从软件查找服务返回的结果无效 我怎么解决这个问题 检查 iTunes Connect 中您的应用程序状态是否为 等待上传 您可以更改状态以按 准备上传二进制
  • 在 iPhone 上下载、保存和播放 mp3

    我想从某个网站下载 mp3 文件 将其保存到我的 CoreData 模型 AudioMp3 中 然后播放 下面的函数可以工作 但首先 效率低下 因为它必须首先将 mp3 保存到文件 其次 它在接下来的调用次数中重复播放相同的 mp3 我认为
  • 定位精度定义 - iOS

    iOS 上返回的 准确性 或 不确定性 的统计意图是什么 即使是近似值 例如 Android 文档对其返回的精度数字进行了解释 从这个意义上讲 它大约是一个标准差 我们将准确度定义为 68 置信度的半径 换句话说 如果 您以该位置的纬度和经
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • iOS - 在 UITabBar 上方获取所需的阴影

    我试图让我的标签栏阴影看起来像这张图片中看到的那样 这样做的最佳方法是什么 我正在使用 Objective C Thanks 您可以使用以下代码为任何 UI 对象提供阴影 tabBar layer shadowOffset CGSize w
  • 如何在 iOS 上更改设备音量 - 而不是音乐音量

    我想更改 iOS iPhone 上的设备音量 我知道我可以使用以下几行更改音乐库的音量 implement at first MediaPlayer framework MPMusicPlayerController musicPlayer
  • 解析迁移到 mLabs 和 Heroku 的错误

    我至少一年前将解析数据库迁移到 Mlabs 从那时起我就一直在开发该应用程序 解析仪表板表示我已成功迁移 Mlab 和 Parse 都收到了数据库的更新 然而 在过去一两周内 该应用程序不再经过登录页面 没有调整代码 这是服务器问题 以下是
  • 如何设置 UINavigationbar 的渐变颜色?

    我想设置UINavigationbar backgroundColor渐变颜色 我想通过颜色数组设置它以创建渐变 理想情况下 作为内部的可访问方法UINavigationBar将其颜色更改为此渐变 有什么建议么 除了手动设置图像作为导航栏的
  • 为什么我无法更改 UIBarButtonItem 的标题?

    我想改变UIBarButtonItem s title 但这段代码不起作用 void viewDidLoad self smay void smay AppDelegate apd AppDelegate UIApplication sha
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • 如何使用呼叫目录扩展来识别应用程序中的来电?

    我正在研究callKit框架 我发现通过使用呼叫目录扩展 我们可以识别来电电话号码 我的问题是如何在 iOS 应用程序中实现呼叫目录扩展来识别来电详细信息 我在 Objective C 工作 让一个数 919876xxxxx 使用此方法添加
  • 使用什么来移动 UIView self.frame 或 self.transform 属性?

    这个问题我有点困惑 我知道我可以改变观点self frame origin 但我发现有一个名为 变换 的属性 我认为这是用于在屏幕上移动我的视图等 也许我有点不明白 所以我想知道 我必须使用哪个房产来搬家UIView 或者它的子类 另一个类
  • 重新组织链式可观察量

    我有一大块链接的 Rx 可观察量 当通过选择表视图行时会触发这些可观察量table rx modelSelected 我希望能够打破这个逻辑 因为我目前必须在flatMapLatest 因为这是流程的 第一步 感觉不对 我必须在后续执行更多
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 带有图像的 UITableView 滚动非常慢[重复]

    这个问题在这里已经有答案了 可能的重复 带图像的表格视图 加载和滚动缓慢 https stackoverflow com questions 4071497 table view with images slow load and scro
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • iOS 开发:如何强制 UIWebView 加载 Facebook 的非移动版本?

    我正在深入研究 iOS 开发 当我尝试在 UIWebView 中加载特定的 Facebook 粉丝页面时 它会加载该网站的移动版本 该版本仅加载粉丝页面的墙 而不是我需要加载的特定选项卡 在我的应用程序的 iPad 版本中 UIWebVie
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat
  • 构建 iOS 应用程序后退出代码 1 错误

    我正在尝试使用 RestKit 构建我的项目 当我构建它时 我收到以下错误 我尝试使用 Apple LLVM 3 0 和 LLVM GCC 4 2 进行编译 两者都产生相同的结果 任何人有任何想法是什么导致了这个问题 Ld Users Ji

随机推荐

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

    最近版本的 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从第二个应用程序