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

2022-09-04 06:13:31

详细日志

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 对象?什么是最好的转换器 日期?


答案 1

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();
}

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


答案 2
    // 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() {

推荐