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
);
相关推荐
apcipot_rain4 小时前
C++转Java日记(06)
java·开发语言
金銀銅鐵9 小时前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程
好的佩奇10 小时前
Dart 之集合元素
android·flutter·dart
nice_lcj52011 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
Easyhood11 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
学长毕设12 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
FlightYe12 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
聪明的笨猪猪13 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设13 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
疯华整猫14 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化