1. 程式人生 > >Android ORM 框架:GreenDao 資料庫升級

Android ORM 框架:GreenDao 資料庫升級

這裡寫圖片描述

前言

一,GreenDao 預設的升級方式

GreenDao 預設的升級方式是刪除所有舊版,在重新建新表,這樣一來使用者的本地歷史資料則會丟失,這點我們通過DaoMaster 的內部類 DevOpenHelper 原始碼可以瞭解到。

 /** WARNING: Drops all table on Upgrade! Use only during development. */
    public static class DevOpenHelper extends OpenHelper {
        public DevOpenHelper(Context context, String name) {
            super
(context, name); } public DevOpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { Log.i("greenDAO", "Upgrading schema from version "
+ oldVersion + " to " + newVersion + " by dropping all tables"); dropAllTables(db, true);//刪除所有舊錶 onCreate(db);// 重新建立新表 } }

二、自定義升級方式

1,修改 schemaVersion 版本號(schemaVersion 只能往上升,不能降)

greendao {
    schemaVersion 2 //資料庫版本號
    daoPackage 'com.speedystone.greendaodemo.db'
// 設定DaoMaster、DaoSession、Dao包名 targetGenDir 'src/main/java'//設定DaoMaster、DaoSession、Dao目錄 }

2,自定義 OpenHelper :繼承 DaoMaster.OpenHelper,重新 onUpgrade 方法


/**
 * Created by Speedy on 2017/7/4.
 */
public class DbHelper extends DaoMaster.OpenHelper {

    public DbHelper(Context context, String name) {
        super(context, name);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {

        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion );

        if(newVersion == 2){
            // 修改 USER 表
            db.execSQL("ALTER TABLE 'USER' ADD  'NICKNAME' String");
        }
    }
}

3,在初始化GreenDao 階段,採用自定義的 OpenHelper 替換 DaoMaster.DevOpenHelper

    /**
     * 初始化 GreenDao
     */
    private void initGreenDao() {
     //DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"test.db");//預設的

        DbHelper helper = new DbHelper(this,"test.db");//自定義的 OpenHelper 
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }

三,注意事項

1, @Id 標記的ID欄位,對應資料庫列名會轉化為 “_id ”

2, 通過註解建立的表如果沒有使用 @Property 指明表列名,預設表中列名是大寫單詞

例如:

@Entity
public class User {

    @Id
    private long userId;

    private String name;

    //指明列名
    @Property(nameInDb = "age")
    private int age;
}

對應表結構:

這裡寫圖片描述

這裡寫圖片描述