Android Room数据库,使用Migration给数据库添加一个字段

可以看看下一篇:Room 数据库升级遇到的问题: Migration didn‘t properly handle_今月曾经照古人,今人不见古时月的博客-CSDN博客

1.数据表中增加某个字段。例如增加:bar_data2

package com.cdc.viewModel;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Word {
    //主键,自增
    @PrimaryKey(autoGenerate = true)
    private int id;
    //不使用ColumnInfo,则使用字段名。这里name的值就是数据表的字段名。
    @ColumnInfo(name="english_word")
    private String word;
    @ColumnInfo(name="chinese_meaning")
    private String chineseMeaning;
    @ColumnInfo(name="foo_data")
    private boolean foo;
    @ColumnInfo(name="bar_data")
    private boolean bar;
    @ColumnInfo(name="bar_data2")
    private boolean bar2;
    public boolean isBar2() {
        return bar2;
    }
    public void setBar2(boolean bar2) {
        this.bar2 = bar2;
    }

    public boolean isFoo() {
        return foo;
    }

    public void setFoo(boolean foo) {
        this.foo = foo;
    }

    public boolean isBar() {
        return bar;
    }

    public void setBar(boolean bar) {
        this.bar = bar;
    }

    public Word(String word, String chineseMeaning) {
        this.word = word;
        this.chineseMeaning = chineseMeaning;
    }
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
    public String getChineseMeaning() {
        return chineseMeaning;
    }
    public void setChineseMeaning(String chineseMeaning) {
        this.chineseMeaning = chineseMeaning;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}



2. 修改WordDataBase中的数据库版本号及添加数据迁移规则

package com.cdc.viewModel;
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 = {Word.class},version=4,exportSchema = false)
public abstract class WordDataBase extends RoomDatabase {
    private static WordDataBase INSTANCE;
    //单例模式
    public static synchronized WordDataBase getInstance(Context context){
        if(INSTANCE==null){
            INSTANCE= Room.databaseBuilder(context.getApplicationContext(),WordDataBase.class,"Word_database")
                    //.allowMainThreadQueries() 强制要求在主线程运行(真实环境中不使用)
                    //.fallbackToDestructiveMigration()//破坏试的迁移.原有的数据被清空,重新建立新表
                    .addMigrations(MIGRATION_3_4)

                    .build();
        }
        return INSTANCE;
    }
    public abstract WordDao getWordDao();
    //版本号  3到4
    static final Migration MIGRATION_3_4=new Migration(3,4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //没有布尔值,用INTEGER代替
            //使用"ALTER TABLE Word  ADD COLUMN bar_data2 INTEGER  NOT NULL DEFAULT 1"出错。
            //使用下面分开的形式,可以正确执行
            database.execSQL("ALTER TABLE Word "+" ADD COLUMN bar_data2 INTEGER "+" NOT NULL DEFAULT 1");
        }
    };
}

 注意:执行的sql语言,“NOT NULL DEFAULT 1” 这一句有问题,加上这一句就报错,无法迁移之前的数据,可以去掉。

转载于: Android中Room的使用3_添加一个字段 - 知乎

猜你喜欢

转载自blog.csdn.net/weixin_42602900/article/details/124341133