可以看看下一篇: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” 这一句有问题,加上这一句就报错,无法迁移之前的数据,可以去掉。