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
);
相关推荐
风中芦苇啊17 小时前
Java EasyExcel 导入通用工具类:自定义注解映射字段 + 反射机制
java·开发语言
家有娇妻张兔兔17 小时前
Java 对接 PLC 主流型号最合适的方案:Apache PLC4X 实战指南
java·开发语言·plc·modbus·数据缓存·西门子s7·apache plc4x
码农coding17 小时前
android16 SystemUI之StatusBar启动
android
朱涛的自习室18 小时前
一个 7 x 24 小时为你打工的 AI,Munk AI 开始内测
android·前端·人工智能
摇滚侠18 小时前
Codebuddy 官网 Codebuddy IntelliJ IDEA 插件 阅读笔记 2
java·笔记·intellij-idea
gugucoding18 小时前
24. 【Java】枚举:更安全的常量
java·开发语言
Kyrie_kk18 小时前
Java--BigInteger 超大整数计算
java·算法
李斯维18 小时前
腾讯 Mars XLog 日志框架的编译和修改
android
2501_9160088919 小时前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
开发者联盟league19 小时前
Java 通过 JNA 调用 C++ DLL:关键流程总结
java·c++·jna