Android Sqlite Database Upgrade

來源:互聯網
上載者:User

標籤:

本周著手開發資料同步的功能,但首先要解決的就是sqlite資料庫升級的問題,關於資料庫升級有蠻多方面涉及到,也許你是新增加了功能,所以建立了表,也許你為某些表增加了些欄位,也許你是重構了資料模型與資料結構,不管如何升級,必須要滿足使用者正常升級的情況下原來的資料不會丟失。關於正確的資料庫升級做法網上資料比較少,這次就來介紹下看到的國外一位大牛總結的資料庫升級的正確做法。

Version 1 of your database

大多數我們都是用android提供的SQLiteOpenHelper來建立和管理資料庫,如下代碼:

public class DbHelper extends SQLiteOpenHelper {    private static final String DATABASE_NAME = "mysample.db";    private static final int DATABASE_VERSION = 1;    private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32);";    public DbHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase database) {        database.execSQL(DATABASE_CREATE_SAMPLE_TABLE);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        // Do nothing for now    }}

上述代碼每次執行的時候都會檢查目前的版本的資料庫是否存在,如果不存在則會執行onCreate方法來建立新的資料庫,然後會把資料庫的名字和版本號碼儲存起來;如果已經存在,則會比較目前的版本和DATABASE_VERSION的大小,然後就會去執行onUpgrade方法。

Version 2 of your database

問題是,最好的處理升級的方法是什麼,這裡認為最好的方法是迴圈處理每一個版本的資料庫變化,看樣本:

假設下一版本想為tblSample表新增一個“address”的欄位,新的建立語句應該像這樣:

CREATE TABLE tblSample(    _id integer primary key autoincrement,    name varchar(32),    address varchar(128));

那麼看下新的代碼會是什麼樣的:

public class DbHelper extends SQLiteOpenHelper {    private static final String DATABASE_NAME = "mysample.db";    private static final int DATABASE_VERSION = 2;    private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32), address varchar(128);";    public DbHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase database) {        database.execSQL(DATABASE_CREATE_SAMPLE_TABLE);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        for (int i = oldVersion; i < newVersion; i++) {            switch (i) {                case 1:                    db.execSQL("ALTER TABLE tblSample ADD address varchar(128)");                    break;            }        }    }}

代碼邏輯很簡單,就是一個for迴圈加上switch…case…語句,然後上述代碼卻能處理所有的資料庫升級,不管你是從版本1升級到版本9也好,還是從版本4升級到版本5也好,都可以從容的解決,確切的說,它將能解決從之前的所有版本升級到當前最新的版本。

須要說明的是,如果有些莫名其妙的使用者從高版本升級到低版本(確切的說是降級),例如從版本3不小心降級到版本1了,這種情況下如果只是有了上述代碼則就會拋出異常,造成系統崩潰。android中資料庫降級則會執行onDowngrade方法,為防止有這種情況發生,同樣須要重新這個方法防止程式的異常。

Android Sqlite Database Upgrade

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.