当前位置: 首页 > news >正文

网站建设后期费用/太原优化排名推广

网站建设后期费用,太原优化排名推广,网站后台什么语,企业网站制作一Android GreenDao 升级 保留旧表数据 大川的川关注IP属地: 北京 0.2052019.08.05 11:54:36字数 270阅读 363 瓦力和伊娃 GreenDao升级库版本号之后,以前的旧数据没有了,为啥,因为GreenDao在升级的时候会删除旧库,创建新库&#…

Android GreenDao 升级 保留旧表数据

大川的川关注IP属地: 北京

0.2052019.08.05 11:54:36字数 270阅读 363

瓦力和伊娃

GreenDao升级库版本号之后,以前的旧数据没有了,为啥,因为GreenDao在升级的时候会删除旧库,创建新库,就问你,到这里,脑袋是不是嗡嗡的?!
********别着急,有答案!亲测可用,非常完美~********
查阅资料得到了满意的答案!如下:
  • 第一项: 新建一个MigrationHelper类,它主要是通过创建一个临时表,将旧表的数据迁移到新表中。
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.StandardDatabase;
import org.greenrobot.greendao.internal.DaoConfig;import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** * please call {@link #migrate(SQLiteDatabase, Class[])} or {@link #migrate(Database, Class[])}* */
public final class MigrationHelper {public static boolean DEBUG = false;private static String TAG = "MigrationHelper";private static final String SQLITE_MASTER = "sqlite_master";private static final String SQLITE_TEMP_MASTER = "sqlite_temp_master";private static WeakReference<ReCreateAllTableListener> weakListener;public interface ReCreateAllTableListener{void onCreateAllTables(Database db, boolean ifNotExists);void onDropAllTables(Database db, boolean ifExists);}public static void migrate(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) {printLog("【The Old Database Version】" + db.getVersion());Database database = new StandardDatabase(db);migrate(database, daoClasses);}public static void migrate(SQLiteDatabase db, ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>... daoClasses) {weakListener = new WeakReference<>(listener);migrate(db, daoClasses);}public static void migrate(Database database, ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>... daoClasses) {weakListener = new WeakReference<>(listener);migrate(database, daoClasses);}public static void migrate(Database database, Class<? extends AbstractDao<?, ?>>... daoClasses) {printLog("【Generate temp table】start");generateTempTables(database, daoClasses);printLog("【Generate temp table】complete");ReCreateAllTableListener listener = null;if (weakListener != null) {listener = weakListener.get();}if (listener != null) {listener.onDropAllTables(database, true);printLog("【Drop all table by listener】");listener.onCreateAllTables(database, false);printLog("【Create all table by listener】");} else {dropAllTables(database, true, daoClasses);createAllTables(database, false, daoClasses);}printLog("【Restore data】start");restoreData(database, daoClasses);printLog("【Restore data】complete");}private static void generateTempTables(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) {for (int i = 0; i < daoClasses.length; i++) {String tempTableName = null;DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);String tableName = daoConfig.tablename;if (!isTableExists(db, false, tableName)) {printLog("【New Table】" + tableName);continue;}try {tempTableName = daoConfig.tablename.concat("_TEMP");StringBuilder dropTableStringBuilder = new StringBuilder();dropTableStringBuilder.append("DROP TABLE IF EXISTS ").append(tempTableName).append(";");db.execSQL(dropTableStringBuilder.toString());StringBuilder insertTableStringBuilder = new StringBuilder();insertTableStringBuilder.append("CREATE TEMPORARY TABLE ").append(tempTableName);insertTableStringBuilder.append(" AS SELECT * FROM `").append(tableName).append("`;");db.execSQL(insertTableStringBuilder.toString());printLog("【Table】" + tableName +"\n ---Columns-->"+getColumnsStr(daoConfig));printLog("【Generate temp table】" + tempTableName);} catch (SQLException e) {Log.e(TAG, "【Failed to generate temp table】" + tempTableName, e);}}}private static boolean isTableExists(Database db, boolean isTemp, String tableName) {if (db == null || TextUtils.isEmpty(tableName)) {return false;}String dbName = isTemp ? SQLITE_TEMP_MASTER : SQLITE_MASTER;String sql = "SELECT COUNT(*) FROM `" + dbName + "` WHERE type = ? AND name = ?";Cursor cursor=null;int count = 0;try {cursor = db.rawQuery(sql, new String[]{"table", tableName});if (cursor == null || !cursor.moveToFirst()) {return false;}count = cursor.getInt(0);} catch (Exception e) {e.printStackTrace();} finally {if (cursor != null)cursor.close();}return count > 0;}private static String getColumnsStr(DaoConfig daoConfig) {if (daoConfig == null) {return "no columns";}StringBuilder builder = new StringBuilder();for (int i = 0; i < daoConfig.allColumns.length; i++) {builder.append(daoConfig.allColumns[i]);builder.append(",");}if (builder.length() > 0) {builder.deleteCharAt(builder.length() - 1);}return builder.toString();}private static void dropAllTables(Database db, boolean ifExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) {reflectMethod(db, "dropTable", ifExists, daoClasses);printLog("【Drop all table by reflect】");}private static void createAllTables(Database db, boolean ifNotExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) {reflectMethod(db, "createTable", ifNotExists, daoClasses);printLog("【Create all table by reflect】");}/*** dao class already define the sql exec method, so just invoke it*/private static void reflectMethod(Database db, String methodName, boolean isExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) {if (daoClasses.length < 1) {return;}try {for (Class cls : daoClasses) {Method method = cls.getDeclaredMethod(methodName, Database.class, boolean.class);method.invoke(null, db, isExists);}} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}private static void restoreData(Database db, Class<? extends AbstractDao<?, ?>>... 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");if (!isTableExists(db, true, tempTableName)) {continue;}try {// get all columns from tempTable, take careful to use the columns listList<TableInfo> newTableInfos = TableInfo.getTableInfo(db, tableName);List<TableInfo> tempTableInfos = TableInfo.getTableInfo(db, tempTableName);ArrayList<String> selectColumns = new ArrayList<>(newTableInfos.size());ArrayList<String> intoColumns = new ArrayList<>(newTableInfos.size());for (TableInfo tableInfo : tempTableInfos) {if (newTableInfos.contains(tableInfo)) {String column = '`' + tableInfo.name + '`';intoColumns.add(column);selectColumns.add(column);}}// NOT NULL columns listfor (TableInfo tableInfo : newTableInfos) {if (tableInfo.notnull && !tempTableInfos.contains(tableInfo)) {String column = '`' + tableInfo.name + '`';intoColumns.add(column);String value;if (tableInfo.dfltValue != null) {value = "'" + tableInfo.dfltValue + "' AS ";} else {value = "'' AS ";}selectColumns.add(value + column);}}if (intoColumns.size() != 0) {StringBuilder insertTableStringBuilder = new StringBuilder();insertTableStringBuilder.append("REPLACE INTO `").append(tableName).append("` (");insertTableStringBuilder.append(TextUtils.join(",", intoColumns));insertTableStringBuilder.append(") SELECT ");insertTableStringBuilder.append(TextUtils.join(",", selectColumns));insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";");db.execSQL(insertTableStringBuilder.toString());printLog("【Restore data】 to " + tableName);}StringBuilder dropTableStringBuilder = new StringBuilder();dropTableStringBuilder.append("DROP TABLE ").append(tempTableName);db.execSQL(dropTableStringBuilder.toString());printLog("【Drop temp table】" + tempTableName);} catch (SQLException e) {Log.e(TAG, "【Failed to restore data from temp table 】" + tempTableName, e);}}}private static List<String> getColumns(Database db, String tableName) {List<String> columns = null;Cursor cursor = null;try {cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 0", null);if (null != cursor && cursor.getColumnCount() > 0) {columns = Arrays.asList(cursor.getColumnNames());}} catch (Exception e) {e.printStackTrace();} finally {if (cursor != null)cursor.close();if (null == columns)columns = new ArrayList<>();}return columns;}private static void printLog(String info){if(DEBUG){Log.d(TAG, info);}}private static class TableInfo {int cid;String name;String type;boolean notnull;String dfltValue;boolean pk;@Overridepublic boolean equals(Object o) {return this == o|| o != null&& getClass() == o.getClass()&& name.equals(((TableInfo) o).name);}@Overridepublic String toString() {return "TableInfo{" +"cid=" + cid +", name='" + name + '\'' +", type='" + type + '\'' +", notnull=" + notnull +", dfltValue='" + dfltValue + '\'' +", pk=" + pk +'}';}private static List<TableInfo> getTableInfo(Database db, String tableName) {String sql = "PRAGMA table_info(`" + tableName + "`)";printLog(sql);Cursor cursor = db.rawQuery(sql, null);if (cursor == null)return new ArrayList<>();TableInfo tableInfo;List<TableInfo> tableInfos = new ArrayList<>();while (cursor.moveToNext()) {tableInfo = new TableInfo();tableInfo.cid = cursor.getInt(0);tableInfo.name = cursor.getString(1);tableInfo.type = cursor.getString(2);tableInfo.notnull = cursor.getInt(3) == 1;tableInfo.dfltValue = cursor.getString(4);tableInfo.pk = cursor.getInt(5) == 1;tableInfos.add(tableInfo);// printLog(tableName + ":" + tableInfo);}cursor.close();return tableInfos;}}
}
  • 第二项: 新建一个UpgradeOpenHelper类,继承DaoMaster.DevOpenHelper,重写onUpgrade(Database db, int oldVersion, int newVersion)方法,在该方法中使用MigrationHelper进行数据库升级以及数据迁移。
public class UpgradeOpenHelper extends DaoMaster.OpenHelper {public UpgradeOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory) {super(context, name, factory);}@Overridepublic void onUpgrade(Database db, int oldVersion, int newVersion) {//把需要管理的数据库表DAO作为最后一个参数传入到方法中MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {@Overridepublic void onCreateAllTables(Database db, boolean ifNotExists) {DaoMaster.createAllTables(db, ifNotExists);}@Overridepublic void onDropAllTables(Database db, boolean ifExists) {DaoMaster.dropAllTables(db, ifExists);}},  Test1Dao.class,Test2Dao.class,Test3Dao.class,Test4Dao.class);}
}
  • 第三项: 然后使用UpgradeOpenHelper替代DaoMaster.DevOpenHelper来进行创建数据库等操作。
upgradeOpenHelper= new UpgradeOpenHelper(MyApplication.getInstance(), DB_NAME, null);//建库
mDaoMaster = new DaoMaster(mSQLiteOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
  • 第四项:
    修改Module下build.gradle中数据库的版本号schemaVersion ,递增加1即可,最后运行app

相关文章:

Android GreenDao 升级 保留旧表数据

Android GreenDao 升级 保留旧表数据 大川的川关注IP属地: 北京 0.2052019.08.05 11:54:36字数 270阅读 363 瓦力和伊娃 GreenDao升级库版本号之后&#xff0c;以前的旧数据没有了&#xff0c;为啥&#xff0c;因为GreenDao在升级的时候会删除旧库&#xff0c;创建新库&#…...

记一次证书站有趣的SQL注入

一、确定站点 按照以前文章中提到的寻找可进站测试的思路&#xff0c;找到了某证书站的一处站点&#xff0c;通告栏中写明了初始密码的结构&#xff0c;因此我们可通过信息搜集进入该站点(可以考虑去搜集比较老的学号&#xff0c;因为这样的账号要么被冻结&#xff0c;要么就是…...

1_初识pytorch

之前完全没有了解过深度学习和pytorch&#xff0c;但现在因为某些原因不得不学了。不得不感叹&#xff0c;深度学习是真的火啊。纯小白&#xff0c;有错的欢迎指正~ 参考视频&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆…...

c++typeid()的使用

用处: typeid()函数主要用来获取对应类型或者变量的类型信息&#xff0c;其返回一个std::type_info的对象&#xff0c;这个对象中存放了对应类型的具体信息。 所以typeid()函数就是获取一个type_info的类型&#xff0c;然后可以通过此类型来获取到相应的类型信息。 type_info的…...

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十四)-租云服务器及配环境、docker基本命令

主要介绍了租云服务器和docker配置、基本命令&#xff01;&#xff01;&#xff01; 文章目录 前言 一、云平台 二、租云服务器及安装docker 1.阿里云 2.安装docker 三、docker命令 将当前用户添加到docker用户组 镜像&#xff08;images&#xff09; 容器(container) 四、实战…...

实现一个全栈模糊搜索匹配的功能

提供一个全栈实现的方案&#xff0c;包括 Vue 3 前端、Express 后端和 MySQL 数据库的分类模糊搜索功能。让我们逐步来看&#xff1a; 1. 数据库设计 (MySQL) 首先&#xff0c;我们需要一个存储分类的表&#xff1a; CREATE TABLE categories (id INT AUTO_INCREMENT PRIMAR…...

智慧景区导览系统小程序开发

智慧景区导览系统小程序的开发是一个综合性的过程&#xff0c;旨在通过先进的技术手段提升游客的游览体验。以下是开发智慧景区导览系统小程序的主要步骤和关键点&#xff1a; 一、需求分析 市场调研&#xff1a;了解旅游市场的最新趋势和游客的实际需求&#xff0c;包括游客…...

HIVE调优方式及原因

3.HIVE 调优&#xff1a; 需要调优的几个方面&#xff1a; 1.HIVE语句执行不了 2.HIVE查询语句&#xff0c;在集群中执行时&#xff0c;数据无法落地 HIVE执行时&#xff0c;一开始语句检查没有问题&#xff0c;生成了多个JOB&#xff0c; …...

deploy local llm ragflow

CPU > 4 cores RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 下载docker&#xff1a; 官方下载方式&#xff1a;https://docs.docker.com/desktop/install/ubuntu/ 其中 DEB package需要手动下载并传输到服务器 国内下载方式&…...

测桃花运(算姻缘)的网站系统源码

简介&#xff1a; 站长安装本源码后只要有人在线测算&#xff0c;就可以获得收入哦。是目前市面上最火的变现利器。 本版本无后台&#xff0c;无数据。本版本为开发的逗号联盟接口版本。直接对接逗号联盟&#xff0c;修改ID就可以直接运营收费赚钱。 安装环境&#xff1a;PH…...

电商平台优惠券

优惠券业务逻辑 优惠券的发放&#xff1a; 来源&#xff1a;优惠券可以由平台统一发放&#xff0c;也可以由商家自行发放。平台优惠券的优惠由平台承担&#xff0c;而店铺优惠券则由商家承担。类型&#xff1a;优惠券可以分为满减优惠券、无门槛优惠券等&#xff0c;根据使用限…...

内衣洗衣机多维度测评对比,了解觉飞、希亦、鲸立哪款内衣洗衣机更好

想要代替手洗内衣物&#xff0c;那么一台内衣专用的小型洗衣机就必不可少啦&#xff0c;不仅能够为我们节约更多的时间以及精力&#xff0c;还能大大提高内衣物的卫生&#xff0c;面对于市面上各种各样的小型内衣洗衣机&#xff0c;相信很多小伙伴都无从下手&#xff01; 为一…...

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…...

基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理

1.TCP/IP编程 1.1 概念 IP 是英文 Internet Protocol &#xff08;网络之间互连的协议&#xff09;的缩写&#xff0c;也就是为计算机网络相互连接进行通信而设计的协议。任一系统&#xff0c;只要遵守 IP协议就可以与因特网互连互通。 所谓IP地址就是给每个遵循tcp/ip协议连…...

(BS ISO 11898-1:2015)CAN_FD 总线协议详解6- PL(物理层)规定3

目录 6.4 AUI 规范 6.4.1 一般规定 6.4.2 PCS 到 PMA 消息 6.4.2.1 输出消息 6.4.2.2 Bus_off 消息 6.4.2.3 Bus_off 释放消息 6.4.2.4 FD_Transmit 消息 6.4.2.5 FD_Receive 消息 6.4.3 PMA 到 PCS 消息 6.4.3.1 输入消息 如果有不懂的问题可在评论区点赞后留言&…...

docker环境下php安装扩展步骤 以mysqli为例

docker环境下php安装扩展步骤 以mysqli为例 1.0 前言2.0 php 扩展安装原理3.0 docker 环境下 php 扩展安装3.1 docker php 容器扩展安装路径及原理3.2 docker php 扩展脚本安装过程 同步发布在个人笔记[docker环境下php安装扩展步骤 以mysqli为例]( https://blog.lichenrobo.co…...

医院综合绩效核算系统,绩效核算系统源码,采用springboot+avue+MySQL技术开发,可适应医院多种绩效核算方式。

一、系统概述 作为医院用综合绩效核算系统&#xff0c;系统需要和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作量&#xff0c;绩效考核系统设有手工录入功能&#xff08;可…...

ROOM数据快速入门

ROOM数据库快速入门 文章目录 ROOM数据库快速入门第一章 准备工作第01节 引入库第02节 布局文件第03节 activity类第04节 效果图 第二章 数据类第01节 实体类&#xff08;表&#xff09;第02节 数据访问类&#xff08;DAO&#xff09;第03节 数据Service层第04节 RoomDataBase …...

刷新,前面接口的返回值没有到,第二个接口已经请求完了,导致第二个接口返回数据错误

刷新&#xff0c;前面接口的返回值没有到&#xff0c;&#xff08;前端&#xff09;第二个接口已经请求完了&#xff08;入参没有拿前面那个接口返回的数据&#xff09;&#xff0c;导致第二个接口返回数据错误...

pdcj设计

为了实现这些功能需求&#xff0c;我们需要设计多个数据库表来存储相关的数据&#xff0c;并编写相应的Java代码来处理业务逻辑。下面是各个功能需求对应的MySQL表结构以及部分Java代码示例。 商品设置管理 商品分类管理 商品分类表 (product_categories)CREATE TABLE produ…...

【数据结构】哈希表的模拟实现

文章目录 1. 哈希的概念2. 哈希表与哈希函数2.1 哈希冲突2.2 哈希函数2.3 哈希冲突的解决2.3.1 闭散列&#xff08;线性探测&#xff09;2.3.2 闭散列的实现2.3.3 开散列(哈希桶)2.3.4 开散列的实现 2.4 开散列与闭散列比较 1. 哈希的概念 在我们之前所接触到的所有的数据结构…...

面试经典算法150题系列-数组/字符串操作之多数元素

序言&#xff1a;今天是第五题啦&#xff0c;前面四题的解法还清楚吗&#xff1f;可以到面试算法题系列150题专栏 进行复习呀。 温故而知新&#xff0c;可以为师矣&#xff01;加油&#xff0c;未来的技术大牛们。 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其…...

海南云亿商务咨询有限公司领航抖音电商服务

在当下这个瞬息万变的互联网时代&#xff0c;短视频平台尤其是抖音&#xff0c;正以惊人的速度重塑着消费者的购物习惯与商家的营销版图。在这场电商盛宴中&#xff0c;海南云亿商务咨询有限公司凭借其在抖音电商领域的深厚积累与前瞻视野&#xff0c;正逐步成为众多商家转型升…...

C#初级——继承

继承 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类&#xff0c;不需要完全重新编写新的数据成员和成员函数&#xff0c;只需要设计一个新的类&#xff0c;继承了已有的类的成员即可。这个已有的类被称为的基类&#xff08;父类&#xff0…...

Github 2024-07-29 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量JavaScript项目3非开发语言项目3Python项目1TypeScript项目1C++项目1Lean项目1HTML项目1免费编程学习平台:freeCodeCamp.org 创建周期:3302 天…...

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机&#xff1a;192.168.118.60 这台主机只发布了web服务&#xff0c;没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…...

软考高级科目怎么选?软考高级含金量排序

软考既是国家职业资格考试&#xff0c;又是职称资格考试&#xff0c;含金量很高。软考的报考不设置任何条件&#xff0c;可以跨级考试&#xff0c;也就是非相关专业的人&#xff0c;也可以直接考高级。因此近些年报考软考、尤其是软考高级的人越来越多。 软考高级证书&#xf…...

【机器学习西瓜书学习笔记——模型评估与选择】

机器学习西瓜书学习笔记【第二章】 第二章 模型评估与选择2.1训练误差和测试误差错误率误差 欠拟合和过拟合2.2评估方法留出法交叉验证法自助法 2.3性能度量查准率、查全率与F1查准率查全率F1 P-R曲线ROC与AUCROCAUC 代价敏感错误率与代价曲线代价曲线 2.4比较检验假设检验&…...

vue3+cesium创建地图

1.我这边使用的是cdn引入形式 比较简单的方式 不需要下载依赖 在项目文件的index.html引入 这样cesium就会挂载到window对象上面去了 <!-- 引入cesium-js文件 --><script src"https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Cesium.js"…...

Zookeeper客户端和服务端NIO网络通信源码剖析

文章目录 服务端的ServerCnxFactory到底是个什么东西?ServerCnxFactory 的作用ServerCnxFactory 的实现使用 ServerCnxFactory 的示例注意事项ServerCnxFactory是什么时候完成初始化的?初始化流程代码示例详细步骤1. 创建实例2. 配置3. 启动初始化时机总结服务端基于NIO的Ser…...