當項目中接手的需求需要在就前數據庫數據表做出修改時,不得不面對數據庫表結構的更新問題。一般的sqlite數據庫更新修改數據庫版本號時都會自動調用SqliteOptenHelper及其子類中的onUpgrade()方法,所以只需要在onUpgrade()方法中添加相應的表結構修改的sql語句即可。
然而,在實際項目中會存在多個版本的數據庫升級的問題。比如當前最新版本的數據庫版本為v3,而用戶手中的應用版本卻不盡相同,user1的數據庫版本為v1,user2的數據庫版本為v3,並且從v1到v2是有表結構更改操作的例如添加了表table1_2,v3在v2的基礎上修改了表table1_2,此時如果讓user1應用直接執行到v3的修改表table1_2操作是會出錯的,因為數據庫版本為v1的應用因為還沒有將數據庫版本升級為v2,故根本不存在table1_2,所以直接執行修改表語句必然會報錯。
以下寫法便很好的解決了以上的數據庫跨版本升級問題:
public class DBHelper extends SQLiteOpenHelper { private static String name="data.db"; private static int version=1; public DBHelper(Context context) { super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user( _id integer primary key autoincrement, " + "name text , desc text);"); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion){ case 1: db.execSQL("v1版本時數據庫升級操作"); //舊版本的數據庫神級操作的case語句后都沒有break語句,
//這樣便可以確保每一次升級當前版本到最新版本的更新操作都可以被執行到了 case 2: db.execSQL("v1——v2版本數據庫升級操作"); case 3: db.execSQL("v2——v3版本數據庫升級操作"); //v3版本為當前最新數據庫版本 break; } } }
