GVi*_*i82 5 sql database sqlite android upgrade
我实现了我的sqlite数据库升级系统.但是在上面的链接中,唯一的例子显示了如何在表中添加新列.onUpgrade方法中的代码片段是
try {
db.execSQL("ALTER TABLE " + NOTES_TABLE_NAME + " ADD COLUMN "
+ Notes.TAGS + " TEXT;");
db.execSQL("ALTER TABLE " + NOTES_TABLE_NAME + " ADD COLUMN "
+ Notes.ENCRYPTED + " INTEGER;");
db.execSQL("ALTER TABLE " + NOTES_TABLE_NAME + " ADD COLUMN "
+ Notes.THEME + " TEXT;");
} catch (SQLException e) {
Log.e(TAG, "Error executing SQL: ", e);
// If the error is "duplicate column name" then everything is fine,
// as this happens after upgrading 2->3, then downgrading 3->2,
// and then upgrading again 2->3.
}
// *** other upgrade from version x->y
// ***
Run Code Online (Sandbox Code Playgroud)
在onCreate中,这样的事情:
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " ("
// Version 2:
+ Notes._ID + " INTEGER PRIMARY KEY,"
+ Notes.TITLE + " TEXT,"
+ Notes.NOTE + " TEXT,"
+ Notes.CREATED_DATE + " INTEGER,"
+ Notes.MODIFIED_DATE + " INTEGER,"
// Version 3:
+ Notes.TAGS + " TEXT,"
+ Notes.ENCRYPTED + " INTEGER,"
+ Notes.THEME + " TEXT,"
// Version 4:
+ Notes.SELECTION_START + " INTEGER,"
+ Notes.SELECTION_END + " INTEGER,"
+ Notes.SCROLL_POSITION + " REAL"
+ ");");
}
Run Code Online (Sandbox Code Playgroud)
现在我想要一个没有添加列的新数据库版本,但我只想更改表中某个字段的类型.我怎样才能做到这一点?
这里说http://sqlite.org/lang_altertable.html无法更改字段类型.我该如何规避这个问题呢?
我正在以这种方式在数据库中插入数据:
ContentValues v = new ContentValues();
v.put("field1", myString); // fileld1 in db is defined as integer
dbManager.updateTable("mytable", v, whereClause);
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何制作CAST?
SQLite确实不允许更改现有的表列.
但是,SQLite使用动态类型,因此您在表定义中设置的列类型并不重要(除了由于类型亲和性而导致的转换).
在一般情况下,对表(新列除外)的任何更改都需要您创建一个新表:
CREATE TABLE TempTable (...);
INSERT INTO TempTable SELECT col1, col2, ... FROM MyTable;
DROP TABLE MyTable;
ALTER TABLE TempTable RENAME TO MyTable;
Run Code Online (Sandbox Code Playgroud)
如果要更改已存储在表中的值的类型,则必须使用CAST:
...
INSERT INTO TempTable SELECT CAST(col1 AS TEXT), ... From MyTable;
...
Run Code Online (Sandbox Code Playgroud)
对于新值,只需将具有正确类型的值放入ContentValues对象中即可.