数据库Room之引用复杂数据(译)

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不允许对象之间互相引用,必须自己定义数据。

你可能感兴趣的:(数据库Room之引用复杂数据(译))