時間倉促,有錯誤請指出,會及時改正,多謝多謝。
本人用的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中即可。