Android GreenDao框架使用 进阶篇之数据库升级

参考

Github

系列

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步了。

上一篇:Android Studio 4.1配置GreenDao以及详细使用


下一篇:【greenDAO3】 项目搭建与增删改查操作