美文网首页
数据库Room之引用复杂数据(译)

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

作者: kingkingruan | 来源:发表于2018-09-08 20:34 被阅读0次

    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之引用复杂数据(译)

          本文链接:https://www.haomeiwen.com/subject/oemcgftx.html