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时间戳:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)@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包更好.如果你不能,请参阅https://github.com/JakeWharton/ThreeTenABP作为后端.