Jetpack Room - TypeConverter

TypeConverter

1、问题引入
java 复制代码
@Entity(tableName = "Record")
public class Record {

    @PrimaryKey(autoGenerate = true)
    public Integer id;

    @ColumnInfo(name = "message")
    public String message;

    @ColumnInfo(name = "create_time")
    public Date createTime;

    @ColumnInfo(name = "update_time")
    public Date updateTime;

    public Record() {
    }

    @Ignore
    public Record(String message, Date createTime, Date updateTime) {
        this.message = message;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
        return "Record{" +
                "id=" + id +
                ", message='" + message + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}
  • 上述 Room 中的实体类,Room 不知道如何将 java.util.Date 类型存储到 SQLite 数据库中

    Cannot figure out how to save this field into database. You can consider adding a type converter for it.
    public Date createTime;
    ^

2、使用 TypeConverter
(1)Application
  • MyApplication.java
java 复制代码
public class MyApplication extends Application {

    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();

        context = this;
    }

    public static Context getContext() {
        return context;
    }
}
(2)Entity
  • Record.java
java 复制代码
@Entity(tableName = "Record")
public class Record {

    @PrimaryKey(autoGenerate = true)
    public Integer id;

    @ColumnInfo(name = "message")
    public String message;

    @ColumnInfo(name = "create_time")
    public Date createTime;

    @ColumnInfo(name = "update_time")
    public Date updateTime;

    public Record() {
    }

    @Ignore
    public Record(String message, Date createTime, Date updateTime) {
        this.message = message;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
        return "Record{" +
                "id=" + id +
                ", message='" + message + '\'' +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}
(3)Dao
  • RecordDAO.java
java 复制代码
@Dao
public interface RecordDAO {

    @Insert
    void insert(Record record);

    @Query("UPDATE Record SET message = :message, update_time = :updateTime WHERE id = :id")
    void updateById(Integer id, String message, Date updateTime);

    @Query("SELECT * FROM Record")
    List<Record> queryAll();
}
(4)TypeConverter
  • DateConverter.java
java 复制代码
public class DateConverter {
    
    @TypeConverter
    public static Date timestampToDate(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}
(5)Database
  • MyDatabase.java
java 复制代码
@Database(entities = {Record.class}, version = 1, exportSchema = false)
@TypeConverters({DateConverter.class})
public abstract class MyDatabase extends RoomDatabase {

    public static final String DATABASE_NAME = "test.db";

    private static MyDatabase myDatabase;

    public static MyDatabase getInstance() {
        if (myDatabase == null) {
            myDatabase = Room.databaseBuilder(MyApplication.getContext(), MyDatabase.class, DATABASE_NAME).build();
        }
        return myDatabase;
    }

    public abstract RecordDAO getRecordDAO();
}
3、预期表结构与实际表结构
  1. 预期表结构
java 复制代码
@Entity(tableName = "Player")
public class Player {

    @PrimaryKey(autoGenerate = true)
    private Integer id;

    @ColumnInfo(name = "name")
    private String name;

    @ColumnInfo(name = "vipFlag")
    private Boolean vipFlag;

    @ColumnInfo(name = "registerTime")
    private Date registerTime;

    public Player() {
    }

    @Ignore
    public Player(Integer id, String name, Boolean vipFlag, Date registerTime) {
        this.id = id;
        this.name = name;
        this.vipFlag = vipFlag;
        this.registerTime = registerTime;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getVipFlag() {
        return vipFlag;
    }

    public void setVipFlag(Boolean vipFlag) {
        this.vipFlag = vipFlag;
    }

    public Date getRegisterTime() {
        return registerTime;
    }

    public void setRegisterTime(Date registerTime) {
        this.registerTime = registerTime;
    }

    @Override
    public String toString() {
        return "Player{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", vipFlag=" + vipFlag +
                ", registerTime=" + registerTime +
                '}';
    }
}
  1. 实际表结构
sql 复制代码
CREATE TABLE IF NOT EXISTS Player (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT, 
    vipFlag INTEGER, 
    registerTime INTEGER
);
相关推荐
文丑颜不良啊3 分钟前
LeetCode476~500题目解析
java·leetcode
雨落在了我的手上5 分钟前
JavaEE初级(1):计算机是如何⼯作的
java·java-ee
惊讶的猫18 分钟前
Spring AOP
java·开发语言
用户31268748772025 分钟前
Java 异常体系全链路:受检异常到底该不该用
java
ii_best37 分钟前
按键精灵手机助手 v5.2.1 实测:inputText 逐字延时 + 调试面板多行复制,安卓脚本开发的两个输入痛点一次解决
android·开发语言·智能手机·自动化·ai编程·按键精灵
学到老活到老38 分钟前
集合换成线程安全的,就不用加锁了吗?
java·面试
hunterandroid42 分钟前
OkHttp 源码解析:拦截器链、连接池与缓存策略的设计精髓
android
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 今日佳人:需求分析
java·开发语言·交友
蒲公英内测分发1 小时前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
朱涛的自习室1 小时前
高价软件已死,我让 AI 开启了「平替计划」(Day 7 / 7)
android·前端·github