其他分享
首页 > 其他分享> > GreenDao 兼容升级,保留旧数据的---全方面解决方案(1)

GreenDao 兼容升级,保留旧数据的---全方面解决方案(1)

作者:互联网

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities

开源地址:github.com/af913337456…


本文不会花时间去谈 greenDao 是什么

使用 greenDao 作为线上APP 的本地 orm 框架时候,总有数据库表要更新的一天,或早或迟。

目录

出问题的的情形:

第一个情况会直接导致 APP 闪退掉,第二种就是数据不匹配。

几个事实

/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {

@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);
}
}

解决方案

自定义升级策略。 思路参考

在上面的基础上做出如下步骤总结: (看不懂的看下面的符号描述)

对应上面的步骤描述:

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

代码简述

基于上面的二次修改和拓展

调用例子

if (oldVersion < newVersion) {
Log.e(“MyGreenDaoDbHelper”,“进行数据库升级”);
new GreenDaoCompatibleUpdateHelper()
.setCallBack(
new GreenDaoCompatibleUpdateHelper.GreenDaoCompatibleUpdateCallBack() {
@Override
public void onFinalSuccess() {
Log.e(“MyGreenDaoDbHelper”,“进行数据库升级 ===> 成功”);
}

@Override
public void onFailedLog(String errorMsg) {
Log.e(“MyGreenDaoDbHelper”,"升级失败日志 ===> "+errorMsg);
}
}
)
.compatibleUpdate(
db,
PostBeanDao.class,
MatterUserBeanDao.class,
PropsBeanDao.class,
ChannelChatsBeanDao.class,
JoinToChannelReqBeanDao.class
);
Log.e(“MyGreenDaoDbHelper”,“进行数据库升级–完成”);
}

GreenDaoCompatibleUpdateHelper

public final class GreenDaoCompatibleUpdateHelper {

public interface GreenDaoCompatibleUpdateCallBack{
void onFinalSuccess();
void onFailedLog(String errorMsg);
}

private static GreenDaoCompatibleUpdateCallBack callBack;

@SuppressWarnings(“all”)
public void compatibleUpdate(SQLiteDatabase sqliteDatabase, Class<? extends AbstractDao<?, ?>>… daoClasses) {
StandardDatabase db = new StandardDatabase(sqliteDatabase);
/** 创建之前旧表中不存在的新表 /
if(!generateNewTablesIfNotExists_withNoExchangeData(db, daoClasses))
return;
/
* 创建中间表 & 把旧表的数据迁移到中间表 /
if(!generateTempTables_withExchangeDataFromOldTable(db, daoClasses))
return;
/
* 把旧表全部删除 /
if(!dropAllTables(db, true, daoClasses))
return;
/
* 创建所有新表 /
if(!createAllTables_withNoExchangeData(db, false, daoClasses))
return;
/
* 把中间表的数据迁移到新表 & 删除中间表 */
restoreData_fromTempTableToNewTable(db, daoClasses);
if(callBack != null)
callBack.onFinalSuccess();
callBack = null;
}

public GreenDaoCompatibleUpdateHelper setCallBack(GreenDaoCompatibleUpdateCallBack callBack1){
callBack = callBack1;
return this;
}
… // 去 gitHub 下载完整代码
}

标签:class,GreenDao,db,兼容,---,void,daoClasses,public,旧表
来源: https://blog.csdn.net/m0_65512630/article/details/122132119