GreenDao是Android中常用的数据库管理框架
使用起来雀食方便高效
但是他有一个问题,就是在升级数据库的时候
比如加个字段,加个表之类的
他会删除原来的数据,删表重建
所以一般的解决方案都是创建一个临时表储存数据
升级完了再覆盖回去
虽然可行,但是操作实在过于麻烦

既然原生的SQL可以实现不删库加字段
按理说GreenDao应该不支持
毕竟使用量这么大的库,这个问题肯定有考虑的
在参考前人的文章后,终于找到合适的方案
不删库升级数据库,增加字段

首先,我们来看为什么会删库
在GreenDao make project后生成的DaoMaster.java
有一个DevOpenHelper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/** 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);
}
}

升级的时候其实是调用它的onUpgrade
然后在这里面,我们可以看到有一个dropAllTables的操作
然后又重新创建表,所以升级完数据都么了

原因找到了,解决方案就来了
我们不用它的升级就完事了hhhh

具体操作

  1. 在对应的实体类增加字段或者新加实体类(加表)
  2. make project
  3. 修改GreenDao的schemaVersion
  4. 修改升级方法,具体如下
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
36
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "data-db"){
@Override
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数据库升级