Room - Сравнить списки в Entity - PullRequest
0 голосов
/ 25 июня 2018

У меня проблема с комнатой.У меня есть Entity:

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

Как вы можете видеть, он содержит список идентификаторов (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

Как вы видите, мне нужно сравнить два списка (список в сущности и список из метода) и получить все сущности, которые содержат идентификаторы из списка метода, но этот запрос всегда возвращает 0. Я читал, что со списками TypeConverter могут быть проблемы, но я не могу найти никакого решения.

1 Ответ

0 голосов
/ 11 июля 2018

Решите это с помощью @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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...