我正在使用日期转换器类来转换我的日期对象。但是,我仍然遇到一个错误说。错误:无法弄清楚如何将此字段保存到数据库中。你可以考虑为它添加一个类型转换器。
我的日期转换器类
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static long fromDate(Date date){
return date == null ? null :date.getTime();
}
}
我的数据库表,用于使用日期对象。
@Entity(tableName = "userFitnessDailyRecords")
@TypeConverters(DateConverter.class)
public class UserFitnessDailyRecords {
@NonNull
@PrimaryKey(autoGenerate = true)
public int id;
public Date forDay;
public Date getForDay() {
return forDay;
}
public void setForDay(Date forDay) {
this.forDay = forDay;
}
}
我按照谷歌代码持久性实验室的例子和普通软件室各自的GitHub示例。我正在使用房间版本1.0.0。
答案 0 :(得分:14)
您将从日期转换为长(包装)以及从长(基元)转换为日期。我将它改为Long并编译。此外,在转换器中取消装箱null会产生NPE。
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static Long fromDate(Date date){
return date == null ? null : date.getTime();
}
}
答案 1 :(得分:2)
将转换器类放在数据库类中,而不在模型中:
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
答案 2 :(得分:2)
请参阅我的完整示例。
请参阅文档:https://developer.android.com/training/data-storage/room/referencing-data
my $var1 = $first_result->{var1};
然后将其映射到数据库。
my $var1 = $from_json->{result}[0]{var1};
还有实体。
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();
}
}
答案 3 :(得分:1)
AndroidThreeTen是Java8新时间类的端口,不幸的是,仅适用于api> = 26。使用https://github.com/JakeWharton/ThreeTenABP,我们可以在所有版本的Android上使用LocalDateTime。在科特林,这里是转换器,
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): LocalDateTime? {
return value?.let {
LocalDateTime.ofInstant(
Instant.ofEpochMilli(it), ZoneId.systemDefault()
)
}
}
@TypeConverter
fun LocalDateTimeToTimestamp(date: LocalDateTime?): Long? {
return date?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
}
}
正如其他好的答案已经说过的那样,它已在数据库抽象类中声明:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
答案 4 :(得分:0)
我遇到了同样的问题(如何存储到会议室的时间),但是我使用的是Calendar
,所以我做到了:
[注释:此答案适用于日历]
@TypeConverter
public static Calendar toCalendar(Long l) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(l);
return c == null ? null : c;
}
@TypeConverter
public static Long fromCalendar(Calendar c){
return c == null ? null : c.getTime().getTime();
}
答案 5 :(得分:0)
将Calendar
与Kotlin配合使用(根据O95的答案改编):
@TypeConverter
fun toCalendar(l: Long?): Calendar? =
if (l == null) null else Calendar.getInstance().apply { timeInMillis = l }
@TypeConverter
fun fromCalendar(c: Calendar?): Long? = c?.time?.time
答案 6 :(得分:0)
您也可以在Kotlin上写它
@TypeConverter
fun toDate(dateLong:Long):Date {
return Date(dateLong)
}
@TypeConverter
fun fromDate(date: Date):Long{
return date.time;
}
答案 7 :(得分:0)
如果您不想处理自动装箱和装箱,只需使用如下的原始 long 数据类型:
public class DateConverter {
@TypeConverter
public static Date toDate(long date) {
return new Date(date);
}
@TypeConverter
public static long fromDate(Date date) {
return date == null ? Calendar.getInstance().getTimeInMillis() : date.getTime();
}
}
请注意,这会将日期默认为当前日期。