使用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) {
        @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

 

销毁和重建策略

 

预填充数据库

 

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

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值