更新 SQLite table 而不会丢失 android 中的先前数据

Update SQLite table without losing previous data in android

我正在尝试在旧的 sqlite 数据库表中添加一个新列。这些表是动态的。我的意思是它们是在应用程序用户在应用程序中添加特定数据时创建的。

表名具有相似的后缀。前缀取决于用户输入。现在,在 android 中,如何在不丢失以前数据的情况下在这些表中添加新列?

试试这个逻辑

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        int upgradeTo = oldVersion + 1;
        while (upgradeTo <= newVersion)
        {
            switch (upgradeTo)
            {
                case 2:
                    db.execSQL("ALTER TABLE " + TABLE_REGISTER +"  ADD COLUMN user_mobile TEXT");
                    break;
                case 3:
                    db.execSQL("ALTER TABLE " + TABLE_REGISTER +"  ADD COLUMN user_mobile_new TEXT");
                    break;

            }
            upgradeTo++;
        }
    }

每次添加新列或新 table 只需添加另一个案例并增加数据库版本。您的最后一个案例是您的数据库版本。在我的例子中 dbVersion = 3

希望您已经知道 onUpgrade 方法的工作原理。 onUpgrade 的实现非常简单,它会检测数据库版本是否更改,并将更改对较新版本的数据库生效。这是一个示例实现。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    // The last case will contain the break statement only. As the migration will take place one by one.
    // Here's a nice explanation - 
    switch (oldVersion) {
        case 1:
            doSomeChangesInDBForVersion1();
        case 2:
            doSomeChangesInDBForVersion2();
            break;
    }
}

现在让我们来谈谈您提出的具体问题。据我所知,数据库中的 tables 是动态的,它基于用户输入。您想要在数据库 table 中添加基于用户输入创建的列。

在这种情况下,您需要首先找出现有的 table,然后 运行 每个 table 的 alter 命令。要在您的数据库中查找现有的 table,您可以执行如下操作。

Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
List<String> tableList = new ArrayList<>();

if (c.moveToFirst()) {
    while (!c.isAfterLast()) {
        tableList.add(c.getString(0));
        c.moveToNext();
    }
}

现在将 table 名称存储在一个数组中,然后对每个 table 使用 运行 alter 命令以在每个 table 中添加一个新列.

for (String tableName : tableList) {
    db.execSQL("alter table " + tableName +"  add column new_col TEXT default null");
}

运行 这些执行在您的 onUpgrade 函数中。我没有测试过这段代码。请根据您的要求进行修改。

你遇到了这个问题,我从这个网站中受益,它会告诉你关注这个话题的最佳方式

enter link description here