GreenDao3,当我们进行数据库版本升级的时候,会默认删除删除所有的表,然后重新创建
WARNING已经提示我们了,如果我们需求是在升级数据库之后保存当前的所有数据,则需要对onUpgrade( )方法重写。

/*** @作者:TJ* @时间:2018-11-01* @描述:数据库辅助类*/
public class DBHelper extends DaoMaster.DevOpenHelper {public DBHelper(Context context) {super(context, Constants.DB_NAME, null);}@Overridepublic void onUpgrade(Database db, int oldVersion, int newVersion) {//  2018-11-02  需要进行数据迁移更新的实体类 ,新增的不用加DBMigrationHelper.getInstance().migrate(db, ConsumeInfoDao.class, QuotaInfoDao.class);}
}

数据库初始化时调用,GreenDaoContext是自定义数据储存路径的类,详情参考GreenDao3自定义数据库路径SD卡

public void initDB(){DBHelper dbHelper = new DBHelper(new GreenDaoContext());mDatabase = dbHelper.getReadableDatabase();mDaoMaster = new DaoMaster(mDatabase);mDaoSession = mDaoMaster.newSession();}

DBMigrationHelper是为某大神写的,如下:

/*** @作者:TJ* @时间:2018-11-02* @描述:数据库迁移*/
public class DBMigrationHelper {private static DBMigrationHelper instance;public static DBMigrationHelper getInstance() {if (instance == null) {instance = new DBMigrationHelper();}return instance;}/*** 获取列的名字** @param db* @param tableName* @return*/private static List<String> getColumns(Database db, String tableName) {List<String> columns = new ArrayList<>();Cursor       cursor  = null;try {cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 1", null);if (cursor != null) {columns = new ArrayList<>(Arrays.asList(cursor.getColumnNames()));}} catch (Exception e) {Log.e(tableName, e.getMessage(), e);e.printStackTrace();}finally {if (cursor != null) {cursor.close();}}return columns;}/*** 数据库迁移** @param db* @param daoClasses*/public void migrate(Database db, Class... daoClasses) {//生成临时表,复制表数据generateTempTables(db, daoClasses);DaoMaster.dropAllTables(db, true);DaoMaster.createAllTables(db, false);//恢复数据restoreData(db, daoClasses);}/*** 生成临时表,复制表数据** @param db* @param daoClasses*/private void generateTempTables(Database db, Class... daoClasses) {for (int i = 0; i < daoClasses.length; i++) {DaoConfig daoConfig     = new DaoConfig(db, daoClasses[i]);String    divider       = "";String    tableName     = daoConfig.tablename;String    tempTableName = daoConfig.tablename.concat("_TEMP");ArrayList     properties               = new ArrayList<>();StringBuilder createTableStringBuilder = new StringBuilder();createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" (");for (int j = 0; j < daoConfig.properties.length; j++) {String columnName = daoConfig.properties[j].columnName;if (getColumns(db, tableName).contains(columnName)) {properties.add(columnName);String type = null;try {type = getTypeByClass(daoConfig.properties[j].type);} catch (Exception exception) {exception.printStackTrace();}createTableStringBuilder.append(divider).append(columnName).append(" ").append(type);if (daoConfig.properties[j].primaryKey) {createTableStringBuilder.append(" PRIMARY KEY");}divider = ",";}}createTableStringBuilder.append(");");db.execSQL(createTableStringBuilder.toString());Log.e("DBMigrationHelper", "generateTempTables: sql:" + createTableStringBuilder.toString());StringBuilder insertTableStringBuilder = new StringBuilder();insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" (");insertTableStringBuilder.append(TextUtils.join(",", properties));insertTableStringBuilder.append(") SELECT ");insertTableStringBuilder.append(TextUtils.join(",", properties));insertTableStringBuilder.append(" FROM ").append(tableName).append(";");db.execSQL(insertTableStringBuilder.toString());Log.e("DBMigrationHelper", "generateTempTables: sql:" + insertTableStringBuilder.toString());}}/*** 恢复数据** @param db* @param daoClasses*/private void restoreData(Database db, Class... daoClasses) {for (int i = 0; i < daoClasses.length; i++) {DaoConfig daoConfig       = new DaoConfig(db, daoClasses[i]);String    tableName       = daoConfig.tablename;String    tempTableName   = daoConfig.tablename.concat("_TEMP");ArrayList properties      = new ArrayList();ArrayList propertiesQuery = new ArrayList();for (int j = 0; j < daoConfig.properties.length; j++) {String columnName = daoConfig.properties[j].columnName;if (getColumns(db, tempTableName).contains(columnName)) {properties.add(columnName);propertiesQuery.add(columnName);} else {try {if (getTypeByClass(daoConfig.properties[j].type).equals("INTEGER")) {propertiesQuery.add("0 as " + columnName);properties.add(columnName);}} catch (Exception e) {e.printStackTrace();}}}StringBuilder insertTableStringBuilder = new StringBuilder();insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" (");insertTableStringBuilder.append(TextUtils.join(",", properties));insertTableStringBuilder.append(") SELECT ");insertTableStringBuilder.append(TextUtils.join(",", propertiesQuery));insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";");StringBuilder dropTableStringBuilder = new StringBuilder();dropTableStringBuilder.append("DROP TABLE ").append(tempTableName);db.execSQL(insertTableStringBuilder.toString());db.execSQL(dropTableStringBuilder.toString());Log.e("DBMigrationHelper", "restoreData: sql:" + insertTableStringBuilder.toString());Log.e("DBMigrationHelper", "restoreData: sql:" + dropTableStringBuilder.toString());}}/*** @param type* @return* @throws Exception*/private String getTypeByClass(Class type) throws Exception {if (type.equals(String.class)) {return "TEXT";}if (type.equals(Long.class) || type.equals(Integer.class) ||type.equals(long.class) || type.equals(int.class)) {return "INTEGER";}if (type.equals(Boolean.class) || type.equals(boolean.class)) {return "BOOLEAN";}Exception exception = new Exception("migration helper - class doesn't match with the current parameters".concat(" - Class: ").concat(type.toString()));exception.printStackTrace();throw exception;}
}

Android GreenDao3数据库升级,数据迁移相关推荐

  1. oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法

    <详细讲解Oracle数据库的数据迁移方法>由会员分享,可在线阅读,更多相关<详细讲解Oracle数据库的数据迁移方法(4页珍藏版)>请在人人文库网上搜索. 1.详细讲解 Or ...

  2. ORACLE使用copy方式存储迁移,详细讲解Oracle数据库的数据迁移方法

    添加所需的表空间和用户到目标数据库中:安装所需的SQL*Net2或者Net8软件,并配置用于连接数据库的别名. 在DOS命令提示符下设置oracle_sid=Oracle7_sid. 以Interna ...

  3. Oracle数据库迁移测试数据,Oracle数据库的数据迁移方法

    Oracle数据库的数据迁移方法 发表于:2008-04-14来源:作者:点击数: 随着数据库管理系统和操作系统平台的更新换代的速度的加快,数据库管理员经常需要在两个不同的数据库之间或在两种不同的系统 ...

  4. Android SQLite数据库升级的问题

    SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...

  5. Android Room 数据库升级

    1. 版本号的位置: @Database(entities = {LogEntity.class}, version = 1, exportSchema = false) 就是这里的 Version ...

  6. 分布式数据库--ZMP数据迁移平台

    在云计算.大数据和物联网时代,数字化转型悄然在各行各业中进行.然而数据作为最基础的要素,如何进行多源异构的海量数据交换?如何保证数据的时效性和准确性?如何让海量异构数据实现云上.云下的协同?是我们长此 ...

  7. mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

    FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...

  8. ios13短信如何转移到android,iOS13加入全新数据迁移功能,无需网络也能转移旧手机数据...

    跟许多Android手机一样,iPhone也有数据转移功能.在设置新iPhone的时候,用户可以选择使用iCloud或者iTunes恢复旧手机的备份.但是无可否认,这两种方式都有明显的弊端.使用iCl ...

  9. 金仓数据库KingbaseES数据迁移

    关键字:kingbase,数据迁移,DTS 数据迁移是在不同存储类型.格式和计算机系统之间的数据转换,数据迁移需要使用相应的工具来进行,kingbaseES中为此提供了DTS数据迁移工具. DTS是一 ...

最新文章

  1. mysql将字符转换成数字
  2. hdu4604 不错的子序列问题
  3. 【Android 逆向】Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★
  4. 操作系统——存储管理:分区、分页、分段、请求式分页和虚拟内存
  5. matlab显示的图片,手动保存时四周有白边
  6. .NET Framework 2.0 组件和非托管代码与交互操作详解(转)
  7. 前端学习(1812):前端调试之shadow练习
  8. 1500度的近视能学计算机吗,1500度近视考驾照,近视多少度不能考驾照
  9. 华为hg-526拨号加路由破解简介
  10. C语言结构体初始化(转载)
  11. 分享一些查询资源的网站
  12. matlab版深度学习入门之旅----体验过后的个人记录
  13. 乐优商城第九天,第十天,(商品规格参数模版的新增,商品的新增)
  14. 安卓app里播放youtube视频
  15. java ai寻路_AI自动寻路
  16. 【华为云会议开发指南】开发流程
  17. 年龄识别之AgeNet
  18. PS 2021锁死各项AI新技术!用起来比美图秀秀更简单,几个键搞定老照片修复、变妆、绘画风格转换...
  19. 香港常见问题扫盲贴(港币兑换/签注直飞/刷卡/酒店押金/关税/香港上网)
  20. linux卸载nginx(更新)

热门文章

  1. 证明小于60阶的无非阿贝尔单群用到的定理
  2. ncae的c语言编程高阶怎么考,ncae考试科等目.doc
  3. 为什么要学习单片机?如何开始上手学习单片机?
  4. 黑龙江省谷歌地球高程DEM等高线下载
  5. 前端开发面试知识点大纲
  6. 线性回归和贝叶斯的线性回归
  7. 财务计算机专业英文怎么说,财务与计算机英文简历
  8. 学习python的微信公众号_python学习—实现微信公众号聊天机器人
  9. 智慧交管大屏可视化决策系统
  10. php怎么用不了图像处理函数,php图像处理函数