GreenDao数据库升级实践
GreenDao是Android中常用的数据库管理框架
使用起来雀食方便高效
但是他有一个问题,就是在升级数据库的时候
比如加个字段,加个表之类的
他会删除原来的数据,删表重建
所以一般的解决方案都是创建一个临时表储存数据
升级完了再覆盖回去
虽然可行,但是操作实在过于麻烦
既然原生的SQL可以实现不删库加字段
按理说GreenDao应该不支持
毕竟使用量这么大的库,这个问题肯定有考虑的
在参考前人的文章后,终于找到合适的方案
不删库升级数据库,增加字段
首先,我们来看为什么会删库
在GreenDao make project后生成的DaoMaster.java
里
有一个DevOpenHelper
1 | /** WARNING: Drops all table on Upgrade! Use only during development. */ |
升级的时候其实是调用它的onUpgrade
然后在这里面,我们可以看到有一个dropAllTables
的操作
然后又重新创建表,所以升级完数据都么了
原因找到了,解决方案就来了
我们不用它的升级就完事了hhhh
具体操作
- 在对应的实体类增加字段或者新加实体类(加表)
- make project
- 修改GreenDao的schemaVersion
- 修改升级方法,具体如下至此,升级完成,数据也没丢,也不需要大改动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "data-db"){
public void onUpgrade(Database db, int oldVersion, int newVersion) {
//注释掉这个,不使用官方的升级
//super.onUpgrade(db, oldVersion, newVersion);
int currentVersion = oldVersion;
if(currentVersion == 1){
//可以直接用Dao建表
OrderDetailDao.createTable(db,true);
//增加字段
db.execSQL("alter table ORDER_DETAIL add TYPE int");
//这两句之后数据库版本来到了2
currentVersion = 2;
}
if(currentVersion == 2){
//可以直接用Dao建表
ProductDao.createTable(db,true);
//这句之后数据库版本来到了3
currentVersion = 3;
}
if (currentVersion ==3){
//增加字段
db.execSQL("alter table ORDER_DETAIL add STATUS int");
//这句之后数据库版本来到了4
currentVersion = 4;
}
//理论上走完之后,当前版本已经等于新版本了
//所以这个if并不会走进去
if(currentVersion != newVersion){
super.onUpgrade(db,oldVersion,newVersion);
}
}
};
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
参考链接 -> GreenDAO数据库升级
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鼠鼠在碎觉!
评论
WalineGitalk