【问题标题】:How to merge previous database with new version database sqlite - Android如何将以前的数据库与新版本的数据库 sqlite 合并 - Android
【发布时间】:2015-03-05 06:19:46
【问题描述】:

我在 Playstore 上有一个包含数据库的应用程序。
现在在新版本中,更改了数据库,输入了一个新表。
目前我正在使用sqlite studio 并将数据库文件放在资产中,然后将其复制为应用程序数据库。请参阅this 示例。

我必须删除以前的数据库来复制新的,或者如果我复制新的(覆盖),在这两种情况下用户数据都会丢失。

也许我可以将一个新表附加到当前数据库,但是如果我必须在以前数据库的表中添加一列呢???
我该怎么处理这个???

编辑:如果我必须从数据库中复制数据并重新插入,我如何知道我的数据库中当前存在的表和列。

请指导我...

【问题讨论】:

  • 创建备份,删除旧数据库,创建新数据库并将备份数据从旧数据库复制到新数据库(前提是你知道每个内容需要在哪里放置到哪个表)。
  • @BuhakeSindi 如果我必须从数据库中复制数据并重新插入,我如何知道我的数据库中当前存在的表和列。
  • 将每个表备份到一个文件中,这样您就知道哪个备份文件映射到哪个表。
  • 您可以使用最新的 SQLiteStudio 并进行您通常所做的所有更改,然后打开“DDL 历史记录”窗口 - 您将看到更改数据库所需执行的所有查询,就像SQLiteStudio 做到了。然后,您可以使用这些查询从您的应用程序级别更新用户端的数据库。

标签: java android mysql database sqlite


【解决方案1】:

将数据库中的所有数据放入 ArrayList 或其他任何内容(我建议使用 Arraylist)并删除旧数据库,然后创建新数据库并将所有数据插入新数据库。

这不是正确的方法,而是节省时间的技巧。

干杯

-阿曼

【讨论】:

  • 更好地创建包含 db 中所有列的对象的 ArrayList。
  • @MarkZucchini 如何知道我的应用数据库中当前存在的表和列?
  • @Salmaan 也许你需要实现一个完整的类来做你想做的事情。
  • @Salmaan 实际上 android 包含可能有助于将 db 从一个版本升级到另一个版本的机制。本页(特别是 4 章)介绍了如何使用 sql:vogella.com/tutorials/AndroidSQLite/…。此外,您可以通过命令INSERT INTO Destination SELECT * FROM Source; 将一个表复制到另一个(临时)这会将所有数据从Source 表复制到Destination
【解决方案2】:

对于一个新的表,你只需要在更新方法中添加创建表

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    if(oldVersion < LastVersionWithoutTheTable && newVersion >= LastVersionWithoutTheTable){
        db.execSQL(CREATE_THE_TABLE);
    }
}

对于新列,将所有数据复制到一个数组中,重新创建表并再次插入数据。

也许可以使用 SQL Alter Table,但我从未在 SQlite 数据库上尝试过。

【讨论】:

  • 如果我必须从数据库中复制数据并重新插入,我如何知道我的数据库中当前存在的表和列。
  • 假设你已经在数据库的 v3 中添加了一个列,在 onUpgrade 中,你检查 oldVersion 的值,如果它在 v3 之前,你知道它是没有所有这些新列的表。 (表的内容相同,在某处记录您对数据库的修改,以知道您已在此版本中创建了此表...)我使用字符串数组来存储我的列名(和顺序),您可以使用它来存储旧结构(每个版本的表一个数组,以了解您的表如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多