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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值