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

Ark*_*asu 7 java android kotlin 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

为什么cant Room持久化Date对象?什么可以是日期最好的转换器?

Ale*_*nov 19

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

AppDatabase.java

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

旁注:java.util.Date被认为是设计糟糕(并且java.util.Calendar更糟糕).如果您有任何非平凡的日期时间逻辑并且可以使用API​​级别26(桌面上的Java 8),那么通常使用java.time更好.如果你不能,请参阅https://github.com/JakeWharton/ThreeTenABP作为后端.

  • 或者,不要在代码中使用这些废话,只需在字段中使用 long ,然后在设置字段时,只需从 Date 对象中获取时间即可。认真的谷歌??搞什么?现在已经是 2019 年了,您甚至懒得添加对日期的内置支持吗? (3认同)