android sqlite 升級資料庫 修改表名, 增加欄位,修改欄位型別
升級資料庫
注意:修改資料庫後,一定要記得增加資料庫版本號 +1 . 否則不會走onUpgrade方法.
最殘暴的方法:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
onCreate(db);
}
直接刪表, 資料全都沒了.在正常的產品專案中是不可能這麼幹的。
正確的處理方法以及各種情況的處理:
一,增加一個表
oncreate 增加一個創表語句, onupgrade 也要增加老版本升級建立語句邏輯
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category"); // 增加一個表,建立表語句.
onCreate(db);
}
二. 表中增加一個欄位:@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(CREATE_CATEGORY); // 判斷版本號.如果是老版本, 走upgrade邏輯,建立新的表 default: } }
比如建表語句中增加了一個欄位
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text, "
+ "category_id integer)";
@Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(CREATE_CATEGORY); case 2: db.execSQL("alter table Book add column category_id integer"); default: } }
在upgrade 方法中增加一個case 2: 使用sqlite 語句,增加一個欄位
alter table Book add column category_id integer
Book 是表名
category_id 是欄位名稱
integer 是欄位型別
三 表中刪除一個欄位:
處理方法如 增加一個欄位.
sqlite 語句:
alter table Book
drop column category_id
使用drop 語句刪除欄位
Book 為表名
category_id 為欄位名
四.修改一個欄位型別
注意: alter table Book alter column category_id text
這麼做是錯誤的! SQLite 目前還不支援直接修改欄位。
笨方法一.
增加一個欄位 (這個新欄位名可定和老的不一樣),然後修改app用到此欄位的程式碼.使用新的欄位.
方法二.
-- 把原表改成另外一個名字作為暫存表
ALTER TABLE old_table_name RENAME TO temp_table_name;
-- 如果需要,可以刪除原表的索引
DROP INDEX ix_name;
-- 用原表的名字建立新表
CREATE TABLE old_table_name ( field_name INTEGER PRIMARY KEY AUTOINCREMENT , other_field_name text notnull);
-- 如果需要,可以建立新表的索引
CREATE INDEX ix_name ON old_table_name(field_name);
-- 將暫存表資料寫入到新表,很方便的是不需要去理會自動增長的 ID
INSERT INTO old_table_name SELECT * FROM temp_table_name
-- 刪除暫存表
DROP TABLE temp_table_name;