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

时间:2018-03-15 05:10:24

标签: android sqlite sqliteopenhelper

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

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

3 个答案:

答案 0 :(得分: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 - http://stackoverflow.com/a/26916986/3145960
    switch (oldVersion) {
        case 1:
            doSomeChangesInDBForVersion1();
        case 2:
            doSomeChangesInDBForVersion2();
            break;
    }
}

现在让我们来看看您提出的具体问题。据我所知,数据库中的表是动态的,基于用户输入。您希望在数据库表中添加基于用户输入创建的列。

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

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();
    }
}

现在将表名存储在一个数组中,然后在每个表上运行alter命令,在每个表中添加一个新列。

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

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

答案 1 :(得分:0)

尝试此逻辑

@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++;
        }
    }

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

答案 2 :(得分:0)

您为我遇到了这个问题,我从该站点中受益,它将为您显示遵循该主题的最佳方法

enter link description here