Android Room - 错误:无法弄清楚如何将此字段保存到数据库中

新手上路,请多包涵

详细日志

error: Cannot figure out how to save this field into database. You can
consider adding a type converter for it.
private final java.util.Date mTime = null;

我有一个字段为的实体

var mStartTime : Date = Date() // java.util.Date

为什么 Room 不能保留 Date 对象?什么是 Date 的最佳转换器?

原文由 Arka Prava Basu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

Date 正是 https://developer.android.com/training/data-storage/room/referencing-data 中给出的示例。

例如,如果我们想要持久化 Date 的实例,我们可以编写以下 TypeConverter 来在数据库中存储等效的 Unix 时间戳:

 public class Converters {
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }
    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

前面的示例定义了 2 个函数,一个将 Date 对象转换为 Long 对象,另一个执行从 Long 到 Date 的反向转换。由于 Room 已经知道如何持久化 Long 对象,它可以使用此转换器来持久化 Date 类型的值。

接下来,您将 @TypeConverters 注释添加到 AppDatabase 类,以便 Room 可以使用您为该 AppDatabase 中的每个实体和 DAO 定义的转换器:

应用数据库.java

 @Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

旁注: java.util.Date 被认为设计不当(并且 java.util.Calendar 更糟糕)。如果您有任何重要的日期时间逻辑并且可以摆脱 API 级别 26(桌面上的 Java 8),通常最好使用 java.time package 。如果不能,请参阅 https://github.com/JakeWharton/ThreeTenABP 以获取反向移植。

原文由 Alexey Romanov 发布,翻译遵循 CC BY-SA 4.0 许可协议

    // Java code will not convert to Kotlin very
    // well so here is the Kotlin: Converter
    // class

    public class Converters {
        @TypeConverter
        fun fromTimestamp( value: Long?) :
                       java.sql.Date {
            return java.sql.Date(value ?: 0)
        }
        @TypeConverter
        fun dateToTimestamp(date :java.sql.Date?)
                                 :Long {
            return date?.getTime() ?: 0
       }

    // Here is the type converters example in
    // Kotlin
    @Database(entities = [DbNasaPictures::class],
              version = 2)
    @TypeConverters(Converters::class)
    abstract class PicturesDatabase:
                     RoomDatabase() {

原文由 BroPage 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题