Android GreenDao使用(三)資料庫升級
阿新 • • 發佈:2019-01-27
時間倉促,有錯誤請指出,會及時改正,多謝多謝。
本人用的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中即可。