版本更改
@Entity
public class Word {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "english")
private String word;
private String chinese;
@ColumnInfo(name = "foo_data")
private boolean foo;
}
在原先的数据库实体类之上添加一个元素,此时不进行其他更改直接运行将会报错。
那么就需要更改两个位置:
数据库版本号version
@Database(entities = {Word.class}, version = 2, exportSchema = false)
public abstract class WordDataBase extends RoomDatabase {
}
数据迁移策略
instance = Room.databaseBuilder(context.getApplicationContext(), WordDataBase.class, "word_database")
.fallbackToDestructiveMigration()
.build();
fallbackToDestructiveMigration()
表示抹去数据库所有内容,使用新的数据库(全空)
addMigrations(MIGRATION_2_3)
手动创建迁移策略
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE word ADD COLUMN bar_data INTEGER NOT NULL DEFAULT 1"); //添加行
}
};
有添加行但是没有删除行的对应函数,所以删除行操作麻烦一些。
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) { //删除行需要创建临时数据库、插入所需值、删除旧表、改名
database.execSQL("CREATE TABLE word_temp (id INTEGER PRIMARY KEY NOT NULL, english TEXT," +
"chinese TEXT)");
database.execSQL("INSERT INTO word_temp (id, english, chinese) " +
"SELECT id, english, chinese FROM word");
database.execSQL("DROP TABLE word");
database.execSQL("ALTER TABLE word_temp RENAME TO word");
}
};
参数表示版本迁移变化,使用SQL语句进行数据迁移