session 室-比较实体中的列表

2020年2月19日 38点热度 0条评论

我的房间有问题。
我有一个实体:

@Entity(tableName = "Entity")
data class Entity(val recipients: List<ID>?) {
    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true) var id: Long = 0
}

如您所见,它包含ID的列表(typealias ID = Long)

因此,我制作了TypeConverter:

@TypeConverter
fun getListOfLongs(data: String?): List<ID> {
    if (data == null) {
        return Collections.emptyList()
    }
    val listType = object : TypeToken<List<Long>>() {}.type

    return gson.fromJson(data, listType)
}

@TypeConverter
fun convertListToString(ids: List<ID>): String = gson.toJson(ids)

但是我有一个问题,我无法正确查询此列表:

@Query("select count(*) from Message where recipients in (:recipients)")
fun count(recipients: List<ID>?): Int

如您所见,我需要比较两个列表(实体中的列表和方法中的列表),并从方法的列表中获取包含ID的所有实体,但是此查询始终返回0。我读到TypeConverter的列表可能有问题,但是我可以找不到任何解决方案。

解决方案如下:

用@RawQuery解决:

" WHERE recipients LIKE ${recipients.joinToString(",", "\"", "\"")}"

结束编辑TypeConvertor:

@TypeConverter
fun getListOfLongs(data: String?): List<Long> {
    if (data == null) {
        return Collections.emptyList()
    }
    val listType = object : TypeToken<List<Long>>() {}.type

    return gson.fromJson("[$data]", listType)
}

@TypeConverter
fun convertListToString(ids: List<Long>?): String? {
    if (ids == null) return null
    var idsString = gson.toJson(ids)
    idsString = idsString.replace("]", "")
    idsString = idsString.replace("[", "")
    return idsString
}