Android开发问题:MySQL Timestamp存SQLite失败及Gson解析时间报错
解决两个Android开发中的时间处理问题
我来帮你逐个搞定这两个头疼的问题:
问题1:无法将MySQL Timestamp以Long形式存储到Android SQLite
你的转换器类只实现了从Long转Date的逻辑,但Room需要双向类型转换——存入数据库时得把Date转成Long,读取时再转回来。另外注意你实体类里的@TypeConverters注解写的是JConverter.class,应该是笔误,要改成你的转换器类Converters.class。
修正后的转换器类:
public class Converters { // 从SQLite读取Long值转成Date @TypeConverter public static Date fromTimestamp(Long value) { return value == null ? null : new Date(value); } // 将Date转成Long值存入SQLite @TypeConverter public static Long dateToTimestamp(Date date) { return date == null ? null : date.getTime(); } }
修正后的User实体类:
@Entity @TypeConverters({Converters.class}) // 修正转换器类的引用 public class User { private Date date_added; public Date getDate_added() { return date_added; } public void setDate_added(Date date_added) { this.date_added = date_added; } }
这样Room就能正确把MySQL的Timestamp(转成Date后)转换成Long存储到SQLite里了。
问题2:Gson解析字符串时间戳抛JsonSyntaxException
Gson默认只认ISO 8601格式的日期字符串(比如yyyy-MM-dd'T'HH:mm:ssZ),而你的接口返回的是2018-04-19 21:42:21这种带空格的格式,所以得自定义一个Date类型适配器来处理这种格式。
方法一:全局注册自定义适配器(推荐)
先写一个DateTypeAdapter:
import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateTypeAdapter extends TypeAdapter<Date> { // 匹配接口返回的日期格式 private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); @Override public void write(JsonWriter out, Date value) throws IOException { out.value(dateFormat.format(value)); } @Override public Date read(JsonReader in) throws IOException { try { return dateFormat.parse(in.nextString()); } catch (Exception e) { throw new IOException("日期解析失败", e); } } }
然后构建Gson实例时注册这个适配器:
Gson gson = new GsonBuilder() .registerTypeAdapter(Date.class, new DateTypeAdapter()) .create(); // 现在解析就不会报错了 User[] users = gson.fromJson(response, User[].class);
方法二:在实体类字段上单独指定适配器
如果不想全局生效,可以在User类的date_added字段上加上@JsonAdapter注解:
@Entity @TypeConverters({Converters.class}) public class User { @JsonAdapter(DateTypeAdapter.class) // 指定适配器 private Date date_added; public Date getDate_added() { return date_added; } public void setDate_added(Date date_added) { this.date_added = date_added; } }
这样用默认的gson.fromJson也能正确解析了。
内容的提问来源于stack exchange,提问作者Jayesh
相关产品推荐
相关产品推荐

