Room数据库 — TypeConverter简单理解

TypeConverter是什么

TypeConverterRoom数据库的类型转换器,可以对收到的数据进行类型转换

例如:

1、服务器返回Long类型的时间戳,我们可以通过TypeConverter将时间戳转换为Date类型
2、如果服务器返回了对象数组,默认Room是无法处理数组的,此时我们可以通过TypeConverter将Json中的数组转换为对象

使用TypeConverter存储数组和日期

首先定义一个Student类和Book类

一个学生是可以有多本书的,所以我们的Student构造中有一个books:List<Book>的列表


@Entity
data class Book(var name: String) {
    @PrimaryKey(autoGenerate = true)
    var id: Long? = null
}

@TypeConverters(BookConvert::class, DateConverter::class)//这里如果没有声明注解,是无法编译通过的,报错信息如下图,只有定义了
@Entity
data class Student(var name: String, var books: List<Book>, var date: Date) {
    @PrimaryKey(autoGenerate = true)
    var id: Long? = null
}
复制代码

使用BookConvert存储,Book数组


class BookConvert {
    private val gson = Gson()

    @TypeConverter
    fun objectToString(list: List<Book>): String {
        return gson.toJson(list)
    }

    @TypeConverter
    fun stringToObject(json: String?): List<Book> {
        val listType: Type = object : TypeToken<List<Book>>() {}.type
        return gson.fromJson(json, listType)
    }
}
复制代码

使用DateConverter进行日期和时间戳转化

class DateConverter {
    @TypeConverter
    fun revertDate(value: Long): Date {
        return Date(value);
    }

    @TypeConverter
    fun converterDate(value: Date): Long {
        return value.time;
    }
}
复制代码

数据存储结果

其它

如何把TypeConverter添加给多个对象

将注解添加到Datebase对象上

@Database(entities = arrayOf(User::class), version = 1)
    @TypeConverters(Converters::class)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    }
    

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享