Android Room2.0之@TypeConverters使

作者: Jack_e002 | 来源:发表于2018-11-12 23:06 被阅读346次

    前言

    Room是Google 新推出的Jetpack组件库中一款操作数据库的SQLITE ORM库。其风格类似Retrofit,使用注解+接口声明形式,简化了数据库的操作。

    随着时间的推迟,Room迭代更新的版本也越来越快,到目前(本文所写时间为止)最新的版本是2.1.0-alpha02,它的一些API也做了调整,本文是记录一次@TypeConverters(ThumbConverter::class)的使用

    本文是以Kotlin语言实例,Java语法类似

    定义实体类 News.kt
    @Entity
    data class News(
            @PrimaryKey
            var row: String,
            var title: String = "",
            var type: Int = 2,
            val thumb: List<String>?,
            var content_time: String? = "",
            var source: String? = "",
            var hot: Int = 0
    )
    
    

    发现Android Studio会报如下错误,编译不通过,原因是@Entity定义的thumb字段无法识别List<String>?类型(非基础类型),最终映射成数据库字段,所以Room提供一个解决方案:手动做类型转换,用转换类告诉Room该如何转换成数据库支持的类型。

    /Users/Documents/code/news_android2.0/module_news/build/tmp/kapt3/stubs/debug/com/zm/module/news/repository/entity/News.java:15: 错误: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
        private final java.util.List<java.lang.String> thumb = null;
                                                       ^
    
    
    定义TypeConverter类
    class ThumbConverter {
        @TypeConverter
        fun getThumbFromString(value: String):List<String>? {
            return value.split(",")
        }
    
        @TypeConverter
        fun storeThumbToString(list: List<String>): String {
            val str = StringBuilder(list[0])
            list.forEach {
                str.append(",").append(it)
            }
            return str.toString()
        }
    }
    
    

    @TypeConverter的两个方法是成对出现的,方法名称可以任意命名,重点在入参和出参类型,必须是需要转换的类型和最终转换后的类型,这点想一下原理能明白了。上面示例写入时将List<String>类型转换成以“,”逗号拼接的String类型,读取时再将逗号分割的字符串转换成List<String>类型。

    Room 2.0@TypeConverters调整

    经过上面的定义依然是无法编译通过的,原因是Entity类还需要添加这里@TypeConverters,强调一下@TypeConverters 是有s的,要与转换类方法上的@TypeConverter做区别。在现有的很多文章里提到@TypeConverters都是加到属性上的,如:stackoverflow上的问答,在Room 2.0是会报错的,因为现在已经改为加到Entity类上面了。

    错误的

    @TypeConverters(ThumbConverter::class)
            val thumb: List<String>?,
    
    

    正确的

    @Entity
    @TypeConverters(ThumbConverter::class)
    data class News(
            @PrimaryKey
            var row: String,
            var title: String = "",
            var type: Int = 2,
            val thumb: List<String>?,
            var content_time: String? = "",
            var source: String? = "",
            var hot: Int = 0
    )
    

    后记

    多个转换类可以@TypeConverters(ThumbConverter::class,XXXX::Converter::class)定义。

    相关文章

      网友评论

        本文标题:Android Room2.0之@TypeConverters使

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