Android-greendao-数据库升级
目录
Android greendao 数据库升级
1.问题:
- 使用greendao, 当数据库中增加表,或者表的字段增加,或者减少,必须数据库配置升级,不然再次操作会导致程序闪退,表找不到等现象;
2.解决方法:
1.升级数据库版本号
- 在app的 build.gradle中:
android {
compileSdkVersion 25
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.sr.kywg"
minSdkVersion 16
targetSdkVersion 25
}
greendao {
schemaVersion 2 //数据库的schema版本,也可以理解为数据库版本号,升级版本号 + 1
//设置DaoMaster、DaoSession、Dao包名,也就是要放置这些类的包的全路径。
daoPackage 'com.demo.greendao'
//设置DaoMaster、DaoSession、Dao目录
targetGenDir 'src/main/java'
// generateTests false //设置为true以自动生成单元测试。
// targetGenDirTests 'src/main/java' //应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
}
}
2.修改数据库对应的表的实体类
- 此处根据具体表结构改变更改
@Entity
public class Person {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
private Integer age; // 增加一个字段
}
3.自定义OpenHelper对象
- 此处引入一个依赖框架
implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.0'
- 注意需要添加表结构类文件
public class GreenDaoUpgradeHelper extends DaoMaster.OpenHelper {
public GreenDaoUpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
//这里重写onUpgrade方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, true);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, true);
}
}, PersonDao.class...);
}
}
4.替换默认的DevOpenHelper
public class BaseApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//GreenDao初始化及配置
setDatabase();
}
/**
* 配置greenDao
*/
private void setDatabase() {
// 通过DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为greenDAO。
// 注意:默认的DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
GreenDaoUpgradeHelper mHelper = new GreenDaoUpgradeHelper(this,"KYWG-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
参考文章:https://blog.csdn.net/Maiduoudo/article/details/100099960