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、预期表结构与实际表结构
- 预期表结构
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 +
'}';
}
}
- 实际表结构
sql
CREATE TABLE IF NOT EXISTS Player (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
vipFlag INTEGER,
registerTime INTEGER
);