【问题标题】:how to upgrade database version with new rows with SQLiteAssetHelper如何使用 SQLiteAssetHelper 使用新行升级数据库版本
【发布时间】:2017-02-21 06:49:45
【问题描述】:

我开发了一个教程应用程序,其中保存了 500 多个问题和答案。 他们是另一张名为 favourites 的桌子。这是用于用户输入。 现在,我想用新的问题和答案更新我的应用程序。 但我不想删除收藏夹表的数据(以防用户已将一些问题标记为收藏夹,因此不应从收藏夹中删除这些问题)

那我该怎么做呢? 因为,我使用 SQLassethelper 库进行数据库连接。


我的旧数据库包含:

  1. 数据表(静态表)
  2. 收藏夹表(本地表)

所以,根据 sqliteassethelper 文档,我添加了我的新数据库: 其中包含:更新的数据表。我没有在此处插入收藏夹表,因为它将在脚本文件中创建。 并将该数据库存储在 assets>>databases 文件夹中。

那么 我创建了一个脚本字段 db.db_upgrade_1-2.sql

alter table "favourites" rename to "favourites_tmp";
create table "favourites" (
"id" Integer not null primary key autoincrement unique,
"question" text,
"answer" text,
"category" text,
"catid" integer
);
insert into "favourites" ("id","question","answer","category","catid") select from "favourites_tmp" "id","question","answer","category","catid" from "favourites_tmp";
drop table "favourites_tmp";

所以我认为这里的收藏夹表将使用旧数据创建。 但 当我运行该项目时,它说:没有这样的 tabld favourites。

【问题讨论】:

  • SQLiteAssetHelper README 中有一节与升级有关。
  • 但我不想更改表格。我只想在特定表中插入更多数据(行)
  • 我阅读了自述文件,它包含有关更改表的信息。
  • 我已将 .db 文件保存在 assets/databases 文件夹中

标签: android sqlite upgrade


【解决方案1】:

documentation 告诉你

创建一个文本文件,其中包含将数据库从以前的版本升级到当前版本所需的所有 SQL 命令。

您可以使用任何 SQL 命令,不仅可以使用 ALTER TABLE,还可以使用 INSERT。

assets 文件夹中的数据库文件仅在没有旧数据时使用(如果是第一次安装应用程序)。如果有旧数据,SQLiteAssetHelper 会改为执行 SQL 升级脚本。

SQLiteAssetHelper 项目包含 an example,它显示了此类脚本的外观。

要将数据保存在收藏夹表中,您无需执行任何操作。 要添加新的问题/答案,请使用一堆 INSERT 语句。 (有关如何获取这些 INSERT 语句,请参阅How to compare two SQLite databases。)

【讨论】:

  • 意味着如果我有更多 100 个新问题和 n 个答案,那么我必须在该文件中编写 100 个插入查询?
  • 不行,这样繁琐的任务还是交给电脑吧。如果你想知道如何,那将是一个不同的问题。
  • 我试过这个方法:>>> db.execSQL("attach database ? as old_db", new String[]{database_name_old});。 db.execSQL("插入 "+database_name_new+".favourites " +" select * from old_db.favourites");
  • 但它仍在擦除本地数据...为什么?
  • 这不是升级的方式。 (它不是包含 SQL 命令的文本文件。)请参阅How to compare two SQLite databases
【解决方案2】:

我终于得到了我的问题的答案。 正如我所说,我正在使用 SQLiteAssetHelper 库。 现在我想添加新记录并想发布更新版本。 所以我正在寻找可以将新更新的数据库存储在资产文件夹中的功能。这个库将更新用户手机中的旧数据库。在旧数据库中保留特定表。

但目前这个库不提供这样的功能。 升级脚本只能用于更改旧数据库。我们可以添加新的更新数据库并从新数据库复制数据。

如果我们想添加新数据并且不想删除本地数据表。 那么我们需要在升级脚本中编写插入查询,如该库的文档中所述。

但如果我们必须添加 100 个查询,那么它们就没有捷径可走。 我们必须在升级脚本中编写 100 条插入语句。

如果我们门控错误说 无法将只读数据库从版本 x 升级到 y 这是它的解决方案:

SQLITE cant upgrade read-only database from version 1 to 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2019-05-16
    相关资源
    最近更新 更多