我正在尝试在旧的sqlite数据库表中添加一个新列。这些表是动态的。我的意思是他们是在应用用户在应用中添加特定数据时创建的。
表名具有类似的后缀。前缀取决于用户输入。现在,在android中,如何在这些表中添加新列而不丢失以前的数据?
答案 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)
您为我遇到了这个问题,我从该站点中受益,它将为您显示遵循该主题的最佳方法