【问题标题】:Android SqliteAssetHelper - merging database tables from asset with the existing oneAndroid SqliteAssetHelper - 将资产中的数据库表与现有表合并
【发布时间】:2016-09-12 17:58:52
【问题描述】:

我正在使用 Android SqliteAssetHelper 库 (https://github.com/jgilfelt/android-sqlite-asset-helper) 我已经使用这个库发送了我的数据库,并且该数据库包含 table1 上的一些记录。 现在我想用一个新的数据库更新我的应用程序,其中包含应该插入到我已经发货的数据库中的附加记录。我不确定如何准确编写升级的 SQL 脚本,因为两个数据库的架构相同。有人试过吗?

【问题讨论】:

  • “我如何引用我的新数据库和现有数据库的表” - AFAIK,你没有,至少现有的SQLiteAssetHelper。您可以复制数据(将其放在新用户的新数据库版本中,并在现有用户获取更新的 INSERT 语句中)或将新用户的相同 INSERT 语句应用于原始数据库内容。现在,SQLiteAssetHelper 可以提供一种将新数据库复制到某处的模式,您可以在升级脚本中使用ATTACH DATABASE 来访问它,但我认为不支持。
  • 感谢您的回答。应该支持在升级时插入记录这样简单的操作。只是一个建议,虽然不是抱怨,因为我没有写它:)
  • 我还开了一张票来查看他们的回复 - github.com/jgilfelt/android-sqlite-asset-helper/issues/…

标签: android android-sqlite sqliteopenhelper


【解决方案1】:

在其他答案中由操作员 cmets 后,澄清了有两个数据库要合并在一起。 op 想知道是否有一种方便的方法可以将两个数据库与 SQLiteAssetHelper 库合并在一起。

不幸的是,没有 直接 方法可以做到这一点,因为该库也使用相同的 Android 模式运行 脚本 来修改现有数据库。

解决方法是将第二个数据库(包含 50 条记录)转换为 50 条 INSERT 语句,这些语句将放在现有的 50 条语句旁边。(互联网上有各种工具可以简化该步骤,因此您不需要手动完成。)因此,只要业务逻辑可以一起使用它们,如果模式相同,它们都可以进入原始表;或者如果您需要将它们分开,仍然使用 50 个 INSERT,但将它们插入到不同的表名。

然后,一旦有了这 50 条 INSERT 语句以及 50 条新行的数据,将这些语句放入升级脚本中,您可以按照标准库 documentation 了解如何让该脚本通过该库运行。

【讨论】:

  • 在CSV文件中添加记录,放入asset文件夹,然后读入app数据库,不是更简单吗?
  • 也许吧。但是您将无法获得数据库版本检查功能,您必须检查何时运行或不运行代码以导入该资产文件。这取决于您认为哪种解决方案更适合您的项目。
  • 我尝试了 CSV 文件技术,它似乎更容易。综上所述 - 最初将使用 SQLiteAssetHelper 复制预加载的数据库。但对于后续添加记录,我将使用 CSV 文件。如果数据库中有结构变化,那么它可以由 SQLiteAssetHelper 管理。猜猜这个方法很好。
【解决方案2】:

您可以通过使用sqldiff 找出旧数据库和新数据库之间的差异来实现这一点。

您在两个数据库上调用 sqldiff 并将输出通过管道传输到符合 SQL Asset Helper 升级格式的文件(即<database_name>_upgrade_<from_version>-<to_version>.sql)。

所以,整个事情就是sqldiff database.db database_new.db > database.db_upgrade_1-2.sql

然后只需确保 .sql 文件位于 assets/databases 目录中并更改 Java 代码中的版本号(在示例中,从 1 更改为 2)。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2014-10-22
    • 2013-01-08
    • 2018-11-01
    • 2021-08-28
    相关资源
    最近更新 更多