android room 数据库升级的原则

news2024/12/23 12:45:52

1.如果新加了一张数据表则什么都不用干直接database那里将数据库版本升1 就可以nichuang

在entities里增加新加的entity ProviderMeta.DB_VERSION 版本号增1

room会自动生成 一个ProviderMeta.DB_VERSION 版本号的json文件 比如实例中升级到70 就会生成一个70.json的文件这是room自动生成创建表的

2.原有数据表里增加了一个字段比如最后这行的devicetest

需要做的是 MIGRATION_68_69 写一个alertcolumn的sql exec

 

3.原有数据表如果是改变某个字段的名字 这时候需要复制老表的数据然后插入到新表 然后改变 databse版本号 


package com.voicevision.client.database.migrations

import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.voicevision.client.database.migrations.DatabaseMigrationUtil.KEYWORD_NOT_NULL
import com.voicevision.client.database.migrations.DatabaseMigrationUtil.TYPE_INTEGER
import com.voicevision.client.database.migrations.DatabaseMigrationUtil.TYPE_TEXT

/**
 * Migration from version 67 to 68.
 *
 * This migration makes the local_id column NOT NULL, with -1 as a default value.
 */
@Suppress("MagicNumber")
class Migration67to68 : Migration(67, 68) {
    override fun migrate(database: SupportSQLiteDatabase) {
        val tableName = "filelist"
        val newTableTempName = "${tableName}_new"
        val newColumns = mapOf(
            "_id" to DatabaseMigrationUtil.TYPE_INTEGER_PRIMARY_KEY,
            "filename" to TYPE_TEXT,
    、
        )

        DatabaseMigrationUtil.migrateTable(database, "filelist", newColumns) { columnName ->
            when (columnName) {
                "local_id" -> "IFNULL(local_id, -1)"
                else -> columnName
            }
        }
    }
}



package com.voicevision.client.database.migrations

import androidx.sqlite.db.SupportSQLiteDatabase

object DatabaseMigrationUtil {

    const val TYPE_TEXT = "TEXT"
    const val TYPE_INTEGER = "INTEGER"
    const val TYPE_INTEGER_PRIMARY_KEY = "INTEGER PRIMARY KEY"
    const val KEYWORD_NOT_NULL = "NOT NULL"

    /**
     * Utility method to add or remove columns from a table
     *
     * See individual functions for more details
     *
     * @param newColumns Map of column names and types on the NEW table
     * @param selectTransform a function that transforms the select statement. This can be used to change the values
     * when copying, such as for removing nulls
     */
    fun migrateTable(
        database: SupportSQLiteDatabase,
        tableName: String,
        newColumns: Map<String, String>,
        selectTransform: ((String) -> String)? = null
    ) {
        require(newColumns.isNotEmpty())
        val newTableTempName = "${tableName}_new"
        createNewTable(database, newTableTempName, newColumns)
        copyData(database, tableName, newTableTempName, newColumns.keys, selectTransform)
        replaceTable(database, tableName, newTableTempName)
    }

    /**
     * Utility method to create a new table with the given columns
     */
    private fun createNewTable(
        database: SupportSQLiteDatabase,
        newTableName: String,
        columns: Map<String, String>
    ) {
        val columnsString = columns.entries.joinToString(",") { "${it.key} ${it.value}" }
        database.execSQL("CREATE TABLE $newTableName ($columnsString)")
    }

    /**
     * Utility method to copy data from an old table to a new table. Only the columns in [columnNames] will be copied
     *
     * @param selectTransform a function that transforms the select statement. This can be used to change the values
     * when copying, such as for removing nulls
     */
    private fun copyData(
        database: SupportSQLiteDatabase,
        tableName: String,
        newTableName: String,
        columnNames: Iterable<String>,
        selectTransform: ((String) -> String)? = null
    ) {
        val selectColumnsString = columnNames.joinToString(",", transform = selectTransform)
        val destColumnsString = columnNames.joinToString(",")

        database.execSQL(
            "INSERT INTO $newTableName ($destColumnsString) " +
                "SELECT $selectColumnsString FROM $tableName"
        )
    }

    /**
     * Utility method to replace an old table with a new one, essentially deleting the old one and renaming the new one
     */
    private fun replaceTable(
        database: SupportSQLiteDatabase,
        tableName: String,
        newTableTempName: String
    ) {
        database.execSQL("DROP TABLE $tableName")
        database.execSQL("ALTER TABLE $newTableTempName RENAME TO $tableName")
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发电厂智能巡检机器人:让发电厂更安全、更高效

在发电厂的众多应用场景中&#xff0c;升压站、化学车间、空冷塔、输煤皮带、综合管廊等&#xff0c;一直以来都是人工巡检的主战场。然而&#xff0c;这些场所环境极为复杂&#xff0c;人工巡检面临着诸多难题&#xff0c;强度大、频率低、间隔长等问题突出。这使得设备在运行…

三星应用TRIZ创新方法的经验分享:探索科技前沿的奥秘

TRIZ&#xff0c;即发明问题解决理论&#xff0c;于1946年被提出。它是一种基于知识和经验的创新方法&#xff0c;旨在帮助人们快速有效地解决各种复杂问题。TRIZ理论包含了大量的创新原理、算法和工具&#xff0c;可以帮助企业快速识别问题、寻找解决方案&#xff0c;并推动创…

【前端】VUE项目创建

在所需文件夹中打开cmd命令行窗口&#xff0c;输入vue ui 进入web可视化界面选择创建新项目 根据需求依次完成下列选择&#xff0c;下列是参考配置&#xff0c;完成后点击创建项目即可 最终显示完成

Opencv | 边缘提取

目录 一. 边缘检测1. 边缘的定义2. Sobel算子 边缘提取3. Scharr算子 边缘提取4. Laplacian算子 边缘提取5. Canny 边缘检测算法5.1 计算梯度的强度及方向5.2 非极大值抑制5.3 双阈值检测5.4 抑制孤立弱边缘 二. 轮廓信息1. 获取轮廓信息2. 画轮廓 一. 边缘检测 1. 边缘的定义…

智慧图书管理|基于SSM+vue的网上服装商城系统(源码+数据库+文档)

智慧图书管理目录 基于SSMvue的网上服装商城系统 一、前言 二、系统设计 三、系统功能设计 1.1 服装列表 1.2 公告信息管理 1.3 公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

webpack 入口和出口的最佳实践

入口和出口的最佳实践 {ignore} 具体情况具体分析 下面是一些经典场景 一个页面一个JS 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 源码结构 |—— src|—— pageA 页面A的代码目录|—— index.js 页面A的启动模块|—— ...|—— pageB 页面…

分享一些常用的内外网文件传输工具

内外网隔离后的文件传输是网络安全领域中一个常见而又重要的问题。随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;内外网隔离成为了许多企业和组织保护内部信息安全的重要手段。然而&#xff0c;内外网隔离后如何有效地进行文件传输&#xff0c;成为了摆…

【sgSearch_v2】自定义组件:常用搜索栏筛选框组件(展开后更多搜索内容悬浮于其他组件之上,不影响整体布局高度)。

sgSearch_v2源码 <template><div:class"$options.name":expand"expandSearch":showCollapseBtn"showCollapseBtn"keyup.enter"(expandSearch true), $emit(keyupEnter, {})"><ul class"search-list">&l…

第一阶段--Day1--什么是网络安全?网络安全常用术语

目录 1. 什么是网络安全&#xff1f; 信息系统&#xff08;Information System&#xff09; 信息系统安全三要素&#xff08;CIA&#xff09; 网络空间安全管理流程 网络安全管理 2. 网络安全的常用术语 3. 网络安全形势 4. 中国网络安全产业现状 1. 什么是网络安全&am…

Leetcode—1256. 加密数字【中等】Plus(bitset、find_first_not_of、erase)

2024每日刷题&#xff08;120&#xff09; Leetcode—1256. 加密数字 实现代码 class Solution { public:string encode(int num) {string ans;num 1;while(num ! 0) {ans to_string(num & 1);num num >> 1;}if(ans.empty()) {return "";} else {stri…

解决VMware启动异常

问题1&#xff1a;该虚拟机似乎正在使用中。如果该虚拟机未在使用&#xff0c;请按“获取所有权(T)”按钮获 取它的所有权。否则&#xff0c;请按“取消(C)”按钮以防损坏。 解决步骤&#xff1a; 按弹框提示的配置文件目录下删除后缀为lck的文件&#xff08;lock&#xff09;。…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…

Linux系统编程--信号与管道

1、信号与管道是什么&#xff1f; 首先了解信号与管道的意义&#xff0c;我们需要了解Linux系统中进程之间是如何通信的。Linux操作系统下&#xff0c;以进程为单位来分配或者管理资源&#xff0c;进程之间不能直接访问资源&#xff0c;因此&#xff0c;要求进程间的资源和信息…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

软文伪原创工具有哪些,推荐3款强大的软文伪原创工具

软文作为一种重要的营销和传播手段&#xff0c;受到了越来越多的关注。而随着科技的不断发展&#xff0c;各种软文生产的工具相续出现&#xff0c;如&#xff1a;软文伪原创工具&#xff0c;它能为人们提供便捷、高效的文章生产方式&#xff0c;也及可以节省文章写作的时间与精…

JAVA基础面试题(第十篇)下! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 21. ConcurrentHashMap 的并发度是多少&#xff1f; 在JDK1.7中&#xff0c;并发度默认是16&a…

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张&#xff0c;云渲染一张图的价格会受到多个因素的影响&#xff0c;如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此&#xff0c;无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…

HackMyVM-Slackware

目录 信息收集 arp-scan nmap nikto whatweb WEB web信息收集 gobuster wfuzz hydra ssh连接 提权 系统信息收集 get root 信息收集 arp-scan ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, IPv4…

PDF高效编辑器,一键转换将PDF文件转换成HTML文件,开启文件处理新篇章!

文件格式的转换与处理已成为我们日常工作中不可或缺的一部分。为了满足广大用户对高效、便捷文件处理的需求&#xff0c;我们荣幸地推出了全新的PDF高效编辑器——PDF到HTML一键转换工具&#xff01;这款工具将为您带来前所未有的文件处理体验&#xff0c;让您轻松驾驭文件格式…

vite+vue3配置less

在Vite项目中配置LESS&#xff0c;你需要安装相关的插件&#xff0c;并在Vite配置文件中进行配置。以下是步骤和示例代码&#xff1a; 安装LESS和LESS插件&#xff1a; npm install less --save-dev npm install less-loader --save-dev 在Vite配置文件中&#xff08;通常是v…