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
);
相关推荐
蜗牛互联网6 分钟前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
蜗牛互联网12 分钟前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
Sirens.13 分钟前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
青山木15 分钟前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
卓怡学长25 分钟前
w195基于ssm“Fitfrend”个性化健身
java·intellij-idea
驭渊的小故事38 分钟前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法
雪落漂泊38 分钟前
Linux基本指令(下)
java·linux·服务器
Eloudy39 分钟前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet
谁是谁的谁_bj42 分钟前
Process Lasso进程调度/资源管理工具
java
秋名RG1 小时前
Java历代LTS版本新特性详解(代码增强版)
java·开发语言·python