仅当在列表中提供单个Enum时,使用Enum列表作为参数查询会议室数据库才产生结果,而当列表中有多个Enum时不返回结果。给定查询中单个Enum的列表,返回的结果将仅是与该Enum完全匹配的结果,而没有包含该Enum和其他Enum的结果。
但是,根据此帖子,应返回与包含元素匹配的结果。此外,据我了解,Android文档概述了预期的行为。我发现跟踪的问题性质非常相似,尽管不完全,这导致了AOSP的合并,但对我的问题了解甚少。
感谢任何帮助,代码如下:
枚举
enum class Type(val type: String) {
NORMAL("normal"),
FIGHTING("fighting"),
FLYING("flying"),
POISON("poison"),
GROUND("ground"),
ROCK("rock"),
BUG("bug"),
GHOST("ghost"),
FIRE("fire"),
WATER("water"),
GRASS("grass"),
ELECTRIC("electric"),
PSYCHIC("psychic"),
ICE("ice"),
DRAGON("dragon"),
FAIRY("fairy"),
STEEL("steel");
}
Dao
@Query("SELECT * from pokemon_table WHERE types IN (:typesList)")
fun getFilteredPokemon(typesList: List<Type>): LiveData<List<Pokemon>>
类型转换器
@TypeConverter
fun fromString(value: String?): List<Type>? {
val listType = object : TypeToken<List<Type>>() {}.type
return Gson().fromJson(value, listType)
}
@TypeConverter
fun fromList(list: List<Type>?): String? {
val listType = object : TypeToken<List<Type>>() {}.type
return Gson().toJson(list, listType)
}
这是数据库的快照,用于说明存储的值,使用进行查询listOf(Type.FIRE)
将返回charmeeleon,但不会返回charizard。
正如sergiy-tikhonov在其注释中指出的那样,sql IN运算符仅返回在提供的列表中单次出现时匹配的结果。
我设法通过为每个条目分配两个“类型”列而不是包含“类型”列表的单个列来纠正我的问题(由于每个口袋妖怪只能具有两种类型,因此在不使用表之间关系的情况下就可以使用)。为每个条目分配一个主类型和一个辅助类型,使我可以用一个类型列表查询两个列:
@Query("SELECT * FROM pokemon_table WHERE type_primary IN (:types) UNION SELECT * FROM pokemon_table WHERE type_secondary IN (:types)")
fun getFilteredPokemon(types: List<Type>): LiveData<List<Pokemon>>
我必须修改TypeConverter才能实现此目的:
class TypeConverter {
@TypeConverter fun fromString(value: String) = Type.getTypeByName(value)
@TypeConverter fun fromList(type: Type) = type.type
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句