【问题标题】:Copying Sqlite database file content in CoreData在 CoreData 中复制 Sqlite 数据库文件内容
【发布时间】:2016-07-03 18:23:49
【问题描述】:

我正在为一个早期使用 phone gap 开发的 iOS 应用工作。它有一个用于存储数据的 sqlite 数据库。但是现在在本地开发相同的应用程序时,我正在使用核心数据来存储数据。

现在,当新的本机应用程序替换用户设备上的旧电话间隙应用程序时,我想将现有 sqlite 文件中的数据复制到核心数据中。

因此,当我在预先安装了 phone gap build 的设备上运行应用程序时,我的 app(native) 会替换旧版本,因为我使用的是相同的捆绑 ID,但我无法找到该 sqlite 文件的路径。 sqlite 文件是否仍然存在于文档目录中?

【问题讨论】:

  • 这似乎是一个奇怪的决定;您可以继续使用 sqlite 并且根本不需要任何迁移。就目前而言,您必须构建一个 sqlite 接口,以便在迁移期间读取旧数据并使用 CoreData 将其插入新数据库(iOS 应用程序完全支持迁移)。
  • @Droppy:但问题是我根本无法访问 sqlite 文件。如果我能得到路径,那么我将进行迁移。即使我使用过 sqlite,也会出现同样的问题,因为我无法获取已创建的 sqlite 文件的路径。
  • 如果您不知道手机间隙将文件存储在哪里,它必须在文档文件夹中,您需要编写一些代码来显示文档文件夹中的所有文件。但是,您需要找到一种方法来重放迁移。 iOS 不会在迁移过程中删除文档文件,所以这不是问题。

标签: ios objective-c sqlite core-data nsdocumentdirectory


【解决方案1】:

如果您的其中一台设备上仍安装了示例旧数据库文件,您可以尝试使用 Xcode 中的Device manager 从设备上下载应用程序。

然后您打开捆绑包并搜索您的文件。然后,如果您知道它的位置/名称,您可以简单地访问它,使用一些 SQLite 库读取它并将数据加载到您的 CoreData 后备存储中。请记住,您要么想在NSUserDefaults 中标记它,要么一起删除旧数据库,这样您的应用程序就不会继续迁移(然后可能会意外删除用户的新数据。)我会选择保留旧数据库至少有一个或 2 个版本,这样您就可以验证您的迁移工作是否没有错误/在此过程中删除用户数据。

提示:根据您的数据库有多大,在您执行此操作时向用户显示某种进度或“迁移/优化数据库”可能是一个好主意。因此,您不会在完成迁移之前让用户向数据库添加更多数据。

【讨论】:

  • @Droppy 文档/缓存目录不是都下载到那个容器里了吗?我现在手头没有设备来展示这一点,但很确定应用程序保存在一个容器中,我之前专门从命令行使用 sqlite 读取了 CoreData 数据库。
  • 您提到下载应用程序并搜索捆绑包。那里可能有一个数据库,但它只是一个“种子”数据库,在第一次使用时会复制到文档文件夹中。这是因为您无法写入应用程序包。如果应用程序支持应用程序共享(或任何名称),您可能可以通过 iTunes 获取最新的数据库,它会从应用程序的文档文件夹中获取文件。这是你想要的数据库。
  • 是的;那是 Documents 文件夹,与 app bundle 无关。
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2014-03-20
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多