android - map 的房间类型转换器

标签 android android-room android-architecture-components android-jetpack

你会如何为 Map 编写 TypeConverter?我的方法是通过Moshi来做

class Converters() {

    val moshi = Moshi
            .Builder()
            .add(KotlinJsonAdapterFactory())
            .build()

    val mapOfStringsType = Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)
    val mapOfStringsAdapter = moshi.adapter<Map<String, String>>(mapOfStringsType)


    @TypeConverter
    fun stringToMap(data: String): Map<String, String> {
        return mapOfStringsAdapter.fromJson(data).orEmpty()
    }

    @TypeConverter
    fun mapToString(map: Map<String, String>): String {
        return mapOfStringsAdapter.toJson(map)
    }
}

但是,它有异味,因为我无法通过 Converters() 构造函数注入(inject) Moshi。 而且,恐怕这也不是最好的表现。

最佳答案

我通常将 gson 用于 Room TypeConverters。它允许适用于所有对象类型的简单实现:

public class StringMapConverter {
    @TypeConverter
    public static Map<String, String> fromString(String value) {
        Type mapType = new TypeToken<Map<String, String>>() {
        }.getType();
        return new Gson().fromJson(value, mapType);
    }

    @TypeConverter
    public static String fromStringMap(Map<String, String> map) {
        Gson gson = new Gson();
        return gson.toJson(map);
    }
}

关于android - map 的房间类型转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51912855/

相关文章:

android - 房间 : how to check whether row exists

Android Room 无法识别 List 的 TypeConverer

android - 由于空间中的唯一约束,数据库迁移失败

android - 具有主视图/详细 View 的导航体系结构组件

android - android中的SCTP协议(protocol)支持

android - 如何阻止猴子的疯狂?

java - 为什么在 android 4.0+ 上支持 v7 操作栏转到屏幕底部

android - 如何创建平行四边形形状的背景?

java - 通过更新变量更改 LiveData 源

android - 网络pojo类和数据库实体类,如何避免重复