【发布时间】:2013-10-10 04:45:44
【问题描述】:
在版本升级时,我想在 android 中不存在的 sqlite 数据库表中添加一个新列。如果该列已经存在,则不应更改该表。在 onUpgrade() 方法中,我不会删除表,因为我不想丢失数据。
【问题讨论】:
在版本升级时,我想在 android 中不存在的 sqlite 数据库表中添加一个新列。如果该列已经存在,则不应更改该表。在 onUpgrade() 方法中,我不会删除表,因为我不想丢失数据。
【问题讨论】:
我拼凑了几个cmets来得到这个:
Cursor cursor = database.rawQuery("SELECT * FROM MY_TABLE", null); // grab cursor for all data
int deleteStateColumnIndex = cursor.getColumnIndex("MISSING_COLUMN"); // see if the column is there
if (deleteStateColumnIndex < 0) {
// missing_column not there - add it
database.execSQL("ALTER TABLE MY_TABLE ADD COLUMN MISSING_COLUMN int null;");
}
这故意忽略了数据库版本号,如果该列不存在,则纯粹添加该列(在我的情况下,版本号对我没有帮助,因为在应该添加此列时编号变得不稳定)
【讨论】:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// If you need to add a column
if (newVersion > oldVersion) {
if(!ColunmExists) {
db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
}
}
}
【讨论】:
cursor.getColumnIndex(String columnName) returns -1。
ColunmExists 只是一个变量。
newVersion>oldVersion,你只需要初始化Cursor。所以不会每次都调用。查看修改。
我使用pragma 来查找列是否存在。
fun SupportSQLiteDatabase.safeRunQueryToAddColumn(
tableName: String,
columnName: String,
block: () -> Any) {
val cursor = query(
"SELECT count(*) FROM pragma_table_info('$tableName') WHERE name='$columnName'", null)
val columnExisted = if (cursor.moveToNext()) {
cursor.getInt(0) == 1 // row found
} else false
cursor.close()
if (!columnExisted) {
block()
} else {
Log.w(
"ERROR",
"column add ignored, table : $tableName : column $columnName already existed"
)
}
}
【讨论】: