参考
系列
Android GreenDao框架使用 基础篇
Android GreenDao框架使用 增删改查篇
Android GreenDao框架使用 进阶篇之queryBuilder
GreenDao如果直接修改实体类,增加版本的话数据会直接清除。只能通过外力来解决这方面的问题。
一.添加依赖
在工程的build.gradle文件中添加
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
在项目的build.gradle文件中添加
implementation 'io.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'
目前引用的版本是最新版,后续更新要注意上方的参考文档。
二.重写Helper类
public class GreenDaoUpgradeHelper extends DaoMaster.OpenHelper {
public GreenDaoUpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, 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);
}
}, TestUserDao.class);
}
}
TestUserDao.class这个参数一定要注意,因为快捷键敲出的这个监听方法是没有这个参数的,而且不报错。如果直接运行,它是不知道要升级那个表的。这个位置可以放多个升级表类。
三.替换
public class GreenDaoManager {
private static GreenDaoManager greenDaoManager;
private DaoSession daoSession;
/**
* 私有化
*/
private GreenDaoManager(){
}
/**
* 对外暴露的获取方法
* @return 单例对象
*/
public static GreenDaoManager getInstance(){
if (null==greenDaoManager){
synchronized (GreenDaoManager.class){
if (null==greenDaoManager){
greenDaoManager=new GreenDaoManager();
}
}
}
return greenDaoManager;
}
/**
* 数据库初始化
* @param context 上下文
*/
public void init(Context context){
//替换位置
GreenDaoUpgradeHelper helper = new GreenDaoUpgradeHelper(context, "test-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
/**
* 获取管理特定架构的所有可用DAO对象
* @return daoSession
*/
public DaoSession getDaoSession(){
return daoSession;
}
}
四.升级版本
在项目的build.gradle文件中修改
greendao {
schemaVersion 2
}
五.修改实体类
@Entity
public class TestUser {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
@NotNull
private int age;
private String character;
private String status;
@NotNull
private String sex;
@Index(unique = true)
private String uid;
@Generated(hash = 223104968)
public TestUser(Long id, @NotNull String name, int age, String character,
String status, @NotNull String sex, String uid) {
this.id = id;
this.name = name;
this.age = age;
this.character = character;
this.status = status;
this.sex = sex;
this.uid = uid;
}
@Generated(hash = 925009630)
public TestUser() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUid() {
return this.uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getCharacter() {
return this.character;
}
public void setCharacter(String character) {
this.character = character;
}
public String getStatus() {
return this.status;
}
public void setStatus(String status) {
this.status = status;
}
}
点击Build → Make Project会自动生成代码。
完成之后数据就不会丢失了,前3步做完之后,就可以重复4,5步了。