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

时间:2018-05-24 18:22:34

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

3 个答案:

答案 0 :(得分:8)

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定义的转换器:

     

AppDatabase.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以获得后退。

答案 1 :(得分: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() {

答案 2 :(得分:0)

以上所有答案都是针对字符串列表的。但是,以下内容可帮助您找到用于对象列表的转换器。

只需添加“ Object”类,即可代替“ YourClassName ”。

s1