【发布时间】:2018-08-23 19:46:58
【问题描述】:
我正在尝试在旧的 sqlite 数据库表中添加一个新列。表格是动态的。我的意思是当应用程序用户在应用程序中添加特定数据时创建它们。
表名有类似的后缀。前缀取决于用户输入。现在,在 android 中,如何在这些表中添加新列而不丢失以前的数据?
【问题讨论】:
标签: java android sqlite sqliteopenhelper
我正在尝试在旧的 sqlite 数据库表中添加一个新列。表格是动态的。我的意思是当应用程序用户在应用程序中添加特定数据时创建它们。
表名有类似的后缀。前缀取决于用户输入。现在,在 android 中,如何在这些表中添加新列而不丢失以前的数据?
【问题讨论】:
标签: java android sqlite sqliteopenhelper
我希望您已经知道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 函数中运行这些执行。我没有测试过这段代码。请根据您的要求进行修改。
【讨论】:
DEFAULT 值将应用该值。
试试这个逻辑
@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++;
}
}
每次添加新列或新表时,只需添加另一个案例并增加数据库版本。您的最后一个案例是您的数据库版本。在我的情况下 dbVersion = 3
【讨论】:
您为我遇到了这个问题,我从这个网站中受益,它将向您展示关注该主题的最佳方式
【讨论】: