使用Migration升级数据库

news2024/10/2 17:17:53

使用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) {
        @Override
        public 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) {
        @Override
        public 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;
    }

        @Ignore
    public 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;
    }

    @Ignore
    public Student(int id) {
        this.id = id;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

异常处理 

 Schema文件

在build.gradle上面加

plugins {
    id("com.android.application")
}

android {
    namespace = "com.tiger.room2"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.tiger.room2"
        minSdk = 28
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                argument("room.schemaLocation","$projectDir/schemas".toString())//指定数据库导出的位置
            }
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    //room依赖 API
    implementation("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.coloradmin.cn/o/1504997.html

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

相关文章

Linux系统下使用C++推流多路视频流

先看拉取的视频流效果: 代码如下: 一开始打算使用python写多路视频推流,但在ubuntu系统上搞了好久就是搞不定openh264导致的错误,然后改用c了,代码如下,我这里推了两路视频流,一路是网络摄像头&…

LabVIEW智能Modbus监控系统

LabVIEW智能Modbus监控系统 在自动化和信息化迅速发展下,传统的监控系统已无法满足现代工业对于数据通讯和处理的高效率和高可靠性要求。为了解决这一问题,设计了一套基于LabVIEW的智能Modbus监控系统。该系统利用LabVIEW的图形化编程环境和Modbus协议的…

QT给QLabel设置背景颜色

1.选中label 2.右键点击"改变样式表" 3.填写样式,点击apply,ok 注意 #{QLabel名称},例如名称是label就是QLabel#label

Java两周半速成之路(第十二天)

一.泛型(JDK1.5以后出现的机制) 1.泛型由来 为什么会有泛型呢? 通过案例引入 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问…

【MySQL使用】show processlist 命令详解

show processlist 命令详解 一、命令含义二、命令返回参数三、Command值解释四、State值解释五、参考资料 一、命令含义 对于一个MySQL连接,或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么。SHOW PROCESSLIST 命令的…

浏览器与Node.js事件循环:异同点及工作原理

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2024年目标检测研究进展

YOLOv9 图片来源网络 YOLO相关的研究:https://blog.csdn.net/yunxinan/article/details/103431338

【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

文章目录 【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统01 题目描述02 题目解答03 本题总结整体逻辑框架(详细版)整体逻辑框架(缩略版)按键读取模块按键消抖模块流水灯显示模式(1)从上向下…

基于Java的高校实验室管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib‘

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

Pygame教程07:键盘常量+键盘事件的2种捕捉方式

------------★Pygame系列教程★------------ Pygame教程01:初识pygame游戏模块 Pygame教程02:图片的加载缩放旋转显示操作 Pygame教程03:文本显示字体加载transform方法 Pygame教程04:draw方法绘制矩形、多边形、圆、椭圆、弧…

数学建模-动态规划(美赛运用)

动态规划模型的要素是对问题解决的抽象,其可分为: 阶段。指对问题进行解决的自然划分。例如:在最短线路问题中,每进行走一步的决策就是一个阶段。 状态。指一个阶段开始时的自然状况。例如:在最短线路问题中&#xff…

Linux文件和文件夹操作

前言: 相较于前面背诵的诸多内容,可能现在的部分就需要多多的练习了,难度也慢慢提升。 那就大家一起慢慢努力吧!!!!! 目录 一、Linux目录结构 (一)Window…

HTML概念

文章目录 1. HTML 概念1.1. 简介1.2. 思想1.3. 特点1.4. 语法1.4.1. 标签1.4.2. 属性1.4.3. 标签体1.4.4. 注释 2. HTML 实体2.1. 练习 3. HTML 结构3.1. <!DOCTYPE html>声明3.2. html根标签 4. 补充4.1. 管理文件4.2. 配置 VsCode4.2. 配置 VsCode 1. HTML 概念 1.1. 简…

【项目笔记】java微服务:黑马头条(day01)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)课程对比2)项目概述2.1)能让你收获什么2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备4.2)nacos安装 5)初始工程搭建5.1)环境准备5.2)主体结构 6)登录6.1…

微信小程序-侧滑删除

简介 movable-view和movable-area是可移动的视图容器&#xff0c;在页面中可以拖拽滑动。 本篇文章将会通过该容器实现一个常用的拖拽按钮功能。 使用效果 代码实现 side-view.wtml 布局见下面代码&#xff0c;left view为内容区域&#xff0c;right view为操作按钮&a…

因为一次 Kafka 宕机,终于搞透了 Kafka 高可用原理!

Kafka宕机引发的高可用问题 问题要从一次Kafka的宕机开始说起。 但最近系统测试人员常反馈偶有Kafka消费者收不到消息的情况&#xff0c;登陆管理界面发现三个节点中有一个节点宕机挂掉了。但是按照高可用的理念&#xff0c;三个节点还有两个节点可用怎么就引起了整个集群的消…

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况特殊情况 插入 排序 插入排序基本有序最优稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序基本有序最差不稳定归并排序稳定基数排序稳定

Redis实现用户活跃排行榜

在这里用户活跃度排行榜&#xff0c;主要是基于redis的zset数据结构来实现的&#xff0c;下面来看一下实例。 方案设计 来看一下业务场景先 1.场景说明 在技术派中&#xff0c;提供了一个用户的活跃排行榜&#xff0c;当然作为一个博客社区&#xff0c;更应该实现的是作者排…

惬意上手MySQL

大家好&#xff0c;我又来写博客了&#xff0c;今天给大家介绍一下MySQL,如果你只想让MySQL作为自己的辅助开发工具&#xff0c;那这一篇文章就够了&#xff0c;如果想作为一门语言来学习&#xff0c;那你可以看此文章了解一些基础。 MySQL介绍 数据库可分为关系型数据库和非关…