0

我的 TypeConverter 无法将 GregorianCalendar 转换为 sql Date 类型。以下代码引发错误:

/** due date of item */
@TypeConverters({CalendarConverter.class})
private GregorianCalendar dueDate = null;

错误:(42, 31) 错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

类型转换器代码:

public class CalendarConverter {

@TypeConverter
public static GregorianCalendar fromDate(Date value){
    if(value == null){
        throw new NullPointerException("must not be null");
    }
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(value);
    return cal;
}

@TypeConverter
public static Date toDate(GregorianCalendar calendar){
    if(calendar != null){
        throw new NullPointerException("must not be null");
    }
    Calendar cal = calendar;
    return new Date(cal.getTime().getTime());
}

}

4

1 回答 1

0

Room 只能存储简单的数据类型,需要提供 Date 的类型转换器(或更改您的转换器以将 Calender 转换为 Long):

@TypeConverter
public Date fromTimestamp(Long value) {
    return value == null ? null : new Date(value);
}

@TypeConverter
public Long dateToTimestamp(Date date) {
    if (date == null) {
        return null;
    } else {
        return date.getTime();
    }
}

或者是这样的:

 public class CalendarConverter {

@TypeConverter
public static GregorianCalendar fromLong(Long value){
    if(value == null){
        throw new NullPointerException("must not be null");
    }
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(new Date(value));
    return cal;
}

@TypeConverter
public static Long toLong(GregorianCalendar calendar){
    if(calendar != null){
        throw new NullPointerException("must not be null");
    }
    Calendar cal = calendar;
    return cal.getTime();
}
于 2018-03-07T07:30:33.283 回答