详细日志
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对象?什么可以是日期最好的转换器?
答案 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