在我们平时使用room数据库版本升级的时候,对表字段的改动需要自己写sql语句来升级 (如图1),在room的新版本中,我们可通过配置,让其自动升级并保留数据。
1.引入room的依赖
def room_version = "2.5.0-alpha01"//2.2.5
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
2.设置room数据库生成表的sql语句,这一步非常重要
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments += [
"room.schemaLocation":"$projectDir/schemas".toString(),
"room.incremental":"true",
"room.expandProjection":"true"]
}
}
}
3.基本的配置好了以后我们就可以正常的来增加注解来配置数据的库的自动升级了
@Database(entities = {UserBean.class, SchoolsBean.class},
exportSchema = true,
version = 8,
autoMigrations = {
@AutoMigration(from = 4, to = 5),//数据库升级版本注解
@AutoMigration(from = 5, to = 6),
@AutoMigration(from = 6, to = 7),
@AutoMigration(from = 7, to = 8),
}
)
public abstract class MainDatabase extends RoomDatabase {
4.如果需要在表里新增一个字段如test字段,只需要增加一个@ColumnInfo注解,并为其赋一个默认值
@Entity(tableName = "t_user")
public class UserBean {
@PrimaryKey(autoGenerate = true)
private long _id;
private String name;
private int age;
private String info;
@ColumnInfo(defaultValue = "0")
private int test;
.....
}
配置完成后,我们的项目中会存在多个json文件,这个是本地数据库各个版本的sql语句,请注意,这些json文件需要保存不能删除,否则下次升级会找不到上个数据库的文件,导致自动升级失败。