1. 程式人生 > >android sqlite 升級資料庫 修改表名, 增加欄位,修改欄位型別

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;