使用Migration升级数据库

使用Migration升级数据库 

package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;//一定要写成抽象类
@Database(entities = {Student.class}, version = 3, exportSchema = false)
public abstract class MyDataBase extends RoomDatabase {private static final String DATABASE_NAME = "my_db.db";private static MyDataBase mInstance;public static MyDataBase getInstance(Context context) {if (mInstance == null) {synchronized (MyDataBase.class) {if (mInstance == null) {mInstance = Room.databaseBuilder(context.getApplicationContext(), MyDataBase.class, DATABASE_NAME).addMigrations(MIGRATION_1_2,MIGRATION_2_3)//添加版本升级
//                            .allowMainThreadQueries() 允许主线程操作数据库.build();}}}return mInstance;}public abstract StudentDao getStudentDao();//room自动实现static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE student ADD  COLUMN sex INTEGER NOT NULL DEFAULT 1");}};static final Migration MIGRATION_2_3 = new Migration(2, 3) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE student ADD  COLUMN barData INTEGER NOT NULL DEFAULT 1");}};}
package com.tiger.room2;import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;@Entity(tableName = "student")
public class Student {@PrimaryKey(autoGenerate = true)//主键 自增@ColumnInfo(name = "id",typeAffinity = ColumnInfo.INTEGER)//指定列名  类型public int id;@ColumnInfo(name = "name",typeAffinity = ColumnInfo.TEXT)//指定列名  类型public String name;@ColumnInfo(name = "age",typeAffinity = ColumnInfo.INTEGER)//指定列名  类型public int age;@ColumnInfo(name = "sex",typeAffinity = ColumnInfo.INTEGER)//指定列名  类型public int sex;@ColumnInfo(name = "barData",typeAffinity = ColumnInfo.INTEGER)//指定列名  类型public int barData;//    @Ignore
//    public boolean flag; 属性也可以忽略 ,代表它不是数据库的一列public Student(int id, String name, int age, int sex, int barData) {this.id = id;this.name = name;this.age = age;this.sex = sex;this.barData = barData;}@Ignorepublic Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Ignore //room忽略此构造方法 构造对象public Student(String name, int age) {this.name = name;this.age = age;}@Ignorepublic Student(int id) {this.id = id;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

异常处理 

 Schema文件

在build.gradle上面加

plugins {id("com.android.application")
}android {namespace = "com.tiger.room2"compileSdk = 34defaultConfig {applicationId = "com.tiger.room2"minSdk = 28targetSdk = 34versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"javaCompileOptions {annotationProcessorOptions {argument("room.schemaLocation","$projectDir/schemas".toString())//指定数据库导出的位置}}}buildTypes {release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = JavaVersion.VERSION_1_8}
}dependencies {//room依赖 APIimplementation("androidx.room:room-runtime:2.6.1")//帮助我们生成一些代码 生成接口的实现类annotationProcessor("androidx.room:room-compiler:2.6.1")//适配的依赖implementation("androidx.appcompat:appcompat:1.6.1")implementation("com.google.android.material:material:1.8.0")implementation("androidx.constraintlayout:constraintlayout:2.1.4")testImplementation("junit:junit:4.13.2")androidTestImplementation("androidx.test.ext:junit:1.1.5")androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

 改成true

 

销毁和重建策略

 

预填充数据库

 

要同样的表结构,才能导进去 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式 Linux 学习

在学习嵌入式 Linux 之前,我们先来了解一下嵌入式 Linux 有哪些东西。 1. 嵌入式 Linux 的组成 嵌入式 Linux 系统,就相当于一套完整的 PC 软件系统。 无论你是 Linux 电脑还是 windows 电脑,它们在软件方面的组成都是类似的。 我们一开电…

2023护网蓝初面试

目录 一、渗透测试的流程 二、常见的漏洞 三、中间件漏洞 四、SQL注入原理、种类?防御?预编译原理,宽字节注入原理 预编译原理: 宽字节注入原理: 五、XSS的种类有哪些?区别?修复&#xf…

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

Android14之解决报错:No module named selinux(一百九十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

三.pandas基础

目录 一:认识pandas 1.1 pandas的优势 1.2 下载安装 二:Series数据结构(一维) 2.1 创建Series 创建series对象(一维) ndarray创建Series对象 “显式索引”的方法定义索引标签 dict创建Series对象(通过字典创建) 标量创建Series对象 2.2 访问S…

基于Skywalking开发分布式监控(四)一个案例

上一篇我们简单介绍了基于SkyWalking自定义增强的基本架构,即通过把Trace数据导入数据加工模块进行加工,进行持久化,并赋能grafana展示。 现在我们给出一个例子,对于量化交易系统,市场交易订单提交,该订单…

k8s应用综合实例

k8s应用综合实例 目录 k8s应用综合实例 目录 原文链接 推荐文章 实验环境 实验软件 本节实战 预期 原理 高可用 稳定性 避免单点故障 使用 PDB 健康检查 服务质量 QoS QoS类型 资源回收策略 滚动更新 失败原因 零宕机 HPA 安全性 持久化 Ingress FAQ …

区块链和人工智能的关系以及经典案例

目录 1.区块链与人工智能的关系 2.应用案例:基于区块链的医疗数据共享平台 2.1背景 2.2方案 2.3优势 2.4挑战 区块链技术和人工智能(AI)是两种不同的技术,但它们之间存在着互补关系。区块链技术提供了一种安全、透明、去中心…

《JAVA与模式》之桥梁模式

系列文章目录 文章目录 系列文章目录前言一、桥梁模式的用意二、桥梁模式的结构三、使用场景四、不使用模式的解决方案五、实现发送加急消息前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂…

前端vite+vue3——可视化页面性能耗时指标(fmp、fp)

文章目录 ⭐前言💖vue3系列文章 ⭐可视化fmp、fp指标💖 MutationObserver 计算 dom的变化💖 使用条形图展示 fmp、fp时间 ⭐项目代码⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端vitevue3——可视化页面性能耗时…

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型(LLM,Large Language Model)是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数,使得它们能够处理更复杂的问题,并学习更广泛的知识。自2022 年以来,LLM技术在得到了广泛的应…

企业AI转型之路:策略与实践

目录 前言1 试点项目:积累AI经验1.1 选择有实际价值的项目1.2 创新氛围的激发1.3 员工对新技术的接受度提升 2 建立高效的内部AI团队2.1 团队独立性与高层直报2.2 初期资金支持与资源整合 3 提供全面的AI培训计划3.1 针对不同层次的培训3.2 多样化培训形式3.3 内部人…