首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于地图的房间TypeConverter

用于地图的房间TypeConverter
EN

Stack Overflow用户
提问于 2018-08-19 05:57:17
回答 5查看 3.7K关注 0票数 7

你将如何为地图编写TypeConverter?我的方法是由Moshi来做

代码语言:javascript
复制
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()构造函数注入Moshi。而且,恐怕这也不是最好的表现。

EN

回答 5

Stack Overflow用户

发布于 2018-10-30 02:12:15

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

代码语言:javascript
复制
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);
    }
}
票数 13
EN

Stack Overflow用户

发布于 2021-06-04 20:28:06

我为原始的Map值提出了一个解决方案。例如StringBooleanIntegerLong等。更多信息请访问https://kotlinlang.org/docs/basic-types.html

每次想要从Room数据库中获取一个项目时,创建一个Gson实例的代价可能会很高,在这种情况下,这是一种相当懒惰的解决问题的方法。

如果您曾经看到过转换字符串列表的解决方案,下面的示例应该是不言而喻的。

不是将Map视为Kotlin对象,而是将其视为两个数组:键和值。我们最大的助手是TreeMap,因为Map.keys返回未排序的Set

代码语言:javascript
复制
@TypeConverter
fun fromStringMap(value: Map<String, String>): String {
    val sortedMap = TreeMap(value)
    return sortedMap.keys.joinToString(separator = ",").plus("<divider>")
        .plus(sortedMap.values.joinToString(separator = ","))
}

@TypeConverter
fun toStringMap(value: String): Map<String, String> {
    return value.split("<divider>").run {
        val keys = getOrNull(0)?.split(",")?.map { it }
        val values = getOrNull(1)?.split(",")?.map { it }

        val res = hashMapOf<String, String>()
        keys?.forEachIndexed { index, s ->
            res[s] = values?.getOrNull(index) ?: ""
        }
        res
    }
}

请随意将分隔符"“替换为最适合您的用例,这样您就不会遇到包含分隔符的value/key。

票数 3
EN

Stack Overflow用户

发布于 2020-10-07 11:10:24

根据brian-acker的回应,在Kotlin中使用Moshi的类似TypeConverter将如下所示:

代码语言:javascript
复制
class Converters {

  private val mapAdapter =
      Moshi.Builder().add(SingleToArray.Adapter.FACTORY).build().adapter<Map<String, String>>(
          Map::class.java)

  @TypeConverter
  fun fromJson(aString: String?): Map<String, String>? =
      aString?.let { mapAdapter.fromJson(it) }

  @TypeConverter
  fun toJson(aMap: Map<String, Any>?): String? =
      aMap?.let { anyMapAdapter.toJson(it) }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51912855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档