[英]Room Migration?
我们应该在从版本X
迁移到X+1
描述新表的所有字段,如文档中所示:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))");
}
};
如果是这样,如何使用带有嵌套的Embedded
注释的Embedded
注释来描述class
migration
?
public class DirectorsStaff {
private String secretKey;
@Embedded
private DirectorsAnswer directorsAnswer;
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public DirectorsAnswer getDirectorsAnswer() {
return directorsAnswer;
}
public void setDirectorsAnswer(DirectorsAnswer directorsAnswer) {
this.directorsAnswer = directorsAnswer;
}
}
DirectorsStaff
Embedded
也被Embedded
使用@Embedded
来注释实体/pojo 的字段实际上会在表中创建这样的子字段。
每当您执行具有此类子字段的查询时, Room
都会帮助您将它们组合成特定类型。
因此,您应该在迁移时描述新表的所有字段。
假设数据库有一个版本 1 的Foo
表,而您想为版本 2 添加一个新表Bar
。
@Entity
data class Foo(
@PrimaryKey val id: Int,
val name: String
)
@Entity
data class Bar(
@PrimaryKey val id: Int,
@Embedded(prefix = "foo_") val foo: Foo
)
class Migration1_2: Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE Bar (id INTEGER PRIMARY KEY NOT NULL, foo_id INTEGER NOT NULL, foo_name TEXT NOT NULL)")
}
}
migrate()
应该运行ALTER TABLE
(它的主要目的是不需要描述整个表,而只描述字段或索引,它们将被更改),有时它可能包含一个CREATE TABLE
或一个DROP TABLE
语句。 您注释为@Embedded
内容应该是另一个 Room 实体(这几乎不会影响迁移,但会影响映射)。
使用ColumnInfo
另一种方法,然后您可以直接引用该列
@Entity
data class Foo(
@ColumnInfo(name = "foo_id") val id: Int,
@ColumnInfo(name = "foo_name") val name: String
)
@Entity
data class Bar(
@PrimaryKey val id: Int,
@Embedded val foo: Foo
)
class Migration1_2: Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE Bar (id INTEGER PRIMARY KEY NOT NULL, foo_id INTEGER NOT NULL, foo_name TEXT NOT NULL)")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.