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
}
我对 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
}