GregorianCalendar字段无法通过TypeConverter转为sql Date的问题求助
解决GregorianCalendar与sql.Date的TypeConverter存储问题
Got it!你遇到的是ORM框架(大概率是Room)无法直接识别GregorianCalendar类型导致的存储报错,咱们直接写个靠谱的双向转换器就能解决:
1. 编写TypeConverter实现类
创建一个转换器类,实现GregorianCalendar和java.sql.Date的双向转换,记得处理空值避免空指针:
import java.sql.Date; import java.util.GregorianCalendar; public class CalendarDateConverter { // 把GregorianCalendar转成数据库支持的sql.Date @androidx.room.TypeConverter public static Date convertCalendarToSqlDate(GregorianCalendar calendar) { return calendar == null ? null : new Date(calendar.getTimeInMillis()); } // 把sql.Date转回GregorianCalendar @androidx.room.TypeConverter public static GregorianCalendar convertSqlDateToCalendar(Date date) { if (date == null) { return null; } GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); return calendar; } }
2. 注册转换器到数据库
写完转换器后,必须在你的数据库类上添加@TypeConverters注解,让框架知道要启用这个转换器:
import androidx.room.Database; import androidx.room.RoomDatabase; import androidx.room.TypeConverters; @Database(entities = {你的实体类名称.class}, version = 1) @TypeConverters(CalendarDateConverter.class) public abstract class AppDatabase extends RoomDatabase { // 声明你的Dao接口 public abstract 你的Dao接口 yourDao(); }
额外提示
- 如果你的场景需要保留时分秒等完整时间信息,建议把
GregorianCalendar转成Long类型的时间戳存储,再转回来,这样比sql.Date(只保留日期)更精准 - 确保转换方法上的注解和你用的ORM框架匹配,比如用Room的话就是
@androidx.room.TypeConverter,其他框架要对应替换
内容的提问来源于stack exchange,提问作者SpefFan123
相关产品推荐
相关产品推荐

