Room - 比较实体中的列表

Room - Compare lists in Entity

我对 Room 有疑问。 我有一个实体:

@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 的所有实体,但此查询 returns 始终为 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
}