1. 程式人生 > >Android GreenDao使用(三)資料庫升級

Android GreenDao使用(三)資料庫升級

時間倉促,有錯誤請指出,會及時改正,多謝多謝。

本人用的greendao版本是3.2.2。

前兩篇介紹了greendao的基本用法,今天寫篇資料庫升級的。

前兩篇地址貼出來:

下面開始升級的介紹,首先貼出熱心大神封裝greendao資料庫升級的開源地址,再次感謝這些牛逼的巨人們寬大的肩膀。

點這裡

greendao的資料庫那些dao檔案或者是bean檔案都是我們自己新建的java工程生成的,這個在上篇部落格講了。

我們要升級資料庫,說明我們的表有欄位變了,或者增加了表,或者刪除了表。

我們的資料庫版本是在greendao生成檔案時的那個java類中指定的,例:

// 生成資料庫實體類xxentity 對應的是資料庫的表
        Schema schema = new Schema(100, "com.school.entity");

上面是第一個要注意的點,如果你忘了增加資料庫的版本號,升級應用的時候會出問題。

接下來就是倒入上面大神的依賴了:

在project的gradle中:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

然後在app目錄下的gradle中倒入:
compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.4.0'

上面這個是greendao 3.0以上版本的,下面是3.0以前版本對應的jar:

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.0.1'

接下來就是使用了,上篇部落格中介紹了,封裝了一個數據庫操作類,叫DaoManager,這次稍作修改,下面再次貼出這個類所有程式碼。

注:變化的只是44行的getDaoMaster方法。

public class DaoManager {

    private static final String TAG = DaoManager.class.getSimpleName();

    // 資料庫名稱
    private static final String DB_NAME = "reliable.sqlite";

    // 多執行緒訪問
    private volatile static DaoManager manager;

    private static DaoMaster.DevOpenHelper helper;

    private static DaoMaster daoMaster;

    private static DaoSession daoSession;

    private Context context;

    /**
     * 使用單例模式獲得操作資料庫的物件
     */
    public static DaoManager getInstance(){
        DaoManager instance = null;
        if (manager == null){
            synchronized (DaoManager.class){
                if (instance == null){
                    instance = new DaoManager();
                    manager = instance;
                }
            }
        }
        return manager;
    }

    public void init(Context context){
        this.context = context;
    }

    /**
     * 判斷是否存在資料庫
     * 如果沒有則建立資料庫
     */
    public DaoMaster getDaoMaster(){
        if (daoMaster == null){
//            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            MyOpenHelper myOpenHelper = new MyOpenHelper(context, DB_NAME, null);
            daoMaster = new DaoMaster(myOpenHelper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 完成對資料庫的新增刪除修改查詢等的操作
     * 注:僅僅是一個介面
     */
    public DaoSession getDaoSession(){
        if (daoSession == null){
            if (daoMaster == null){
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    /**
     * 開啟輸出日誌的操作
     * 注:預設是關閉的
     */
    public void setDebug(){
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

    /**
     * 關閉所有的操作
     * 注:資料庫開啟之後,使用完畢必須要關閉
     */
    public void closeConnection(){
        closeHelper();
        closeDaoSession();
    }
    public void closeHelper(){
        if (helper != null){
            helper.close();
            helper = null;
        }
    }
    public void closeDaoSession(){
        if (daoSession != null){
            daoSession.clear();
            daoSession = null;
        }

    }

}




上面的DaoManager的類中變化的只有方法getDaoMaster();

將原來的DaoMaster的DevOpenHelper換成自己定義的GawOpenHelper。

下面貼出GawOpenHelper類:

public class GawOpenHelper extends DaoMaster.DevOpenHelper {

    public GawOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int currentVersion, int lastestVersion) {
        MigrationHelper.migrate(db, SchoolsDao.class, FuckerDao.class, NewDao.class, NewNewDao.class);
    }
}


就一行。。。。。

將你的dao類直接扔到MigrationHelper中即可。