Room封装了基本类型的封箱和开箱,但不允许entity之间的互相引用。本文将描述如何使用类型转换以及为什么不支持对象引用。
使用类型转换
有时候我们希望保存一个自定义类型到单独的列里。为了支持保存自定义数据,可以使用TypeConverter,他将把自定义类型转换成数据库支持的类型保存。
列如要保存Date类型,我们可以像下面的代码那样把Date转换成时间戳,然后保存到数据库中:
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
在上面的代码中定义了两个方法,一个是把Date转换成Long类型的,另一个是把Long转换过成Date。因为Room是支持保存Long类型数据的,所以这样就间支持了保存Date类型数据了。
下一步就是在AppDatabase中添加注解@TypeConverters,这样数据库就能使用该Converter去做转换了:
AppDatabase.java
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
在使用了这些Converter后,你就可以像其他基本类型一样使用自定义数据类型了:
User.java
@Entity
public class User {
...
private Date birthday;
}
UserDao.java
@Dao
public interface UserDao {
...
@Query("SELECT * FROM user WHERE birthday BETWEEN :from AND :to")
List findUsersBornBetweenDates(Date from, Date to);
}
你也可以限制TypeConverter的使用范围,包括只在个别Entity,DAO甚至个别DAO方法。详细资料见TypeConverter
理解为什么Room不允许互相引用
关键:Room不允许对象之间互相引用,必须自己定义数据。
网友评论