【问题标题】:not primitive types in Room database migration不是 Room 数据库迁移中的原始类型
【发布时间】:2017-12-27 14:20:46
【问题描述】:

我正在我的 Room 数据库中添加新实体 FeedItem 并为其编写迁移。

问题:我的 FeedItem 类中有一个 Date 类型,它不是原始类型。在这种情况下,编写迁移的正确方法是什么?

@Entity(tableName = "FeedItem")
public class FeedItem implements Item, Votable {

private int id;
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "feedItemRowIndex")
private int rowIndex;
private int toId;
private int fromId;
private Date date;
...

我的迁移目前看起来像这样。

private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(@NonNull SupportSQLiteDatabase database) {

        database.execSQL("CREATE TABLE FeedItem (feedItemId INTEGER, " +
                "feedItemRowIndex INTEGER, " +
                "feedVotes INTEGER" +
                "feedVote INTEGER" +
                "toId INTEGER" +
                "fromId INTEGER" +
                "date Date" + // i need to change this row
                 ...
                "PRIMARY KEY (feedItemRowIndex))"

这里是日期类型的转换器

public class DateConverter {
@TypeConverter
public static Date toDate(Long timestamp) {
    return timestamp == null ? null : new Date(timestamp);
}

@TypeConverter
public static Long toTimestamp(Date date) {
    return date == null ? null : date.getTime();
}
}

谢谢!

【问题讨论】:

  • 如果它很长,那么它很可能是 INTEGER

标签: android android-room


【解决方案1】:

如果在 build.gradle 文件中设置了 room.schemaLocation,那么您可以查看生成的架构并复制 Room 用于创建表的确切 sql。 Complete example here

【讨论】:

    【解决方案2】:

    这很容易。 Room 生成适合转换器类型的原始类型。

    所以在我的例子中,类型是 INTEGER。感谢@EpicPandaForce 的评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2020-03-22
      • 2020-04-05
      • 2018-06-02
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多