通过IN运算符查询会议室数据库的使用情况,并提供枚举列表

杰克布

仅当在列表中提供单个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章