>source

열거 형 목록을 인수로 사용하여 회의실 데이터베이스를 쿼리하면단일열거 형은 목록에 제공되며 여러 열거 형이 목록에 있으면 결과를 반환하지 않습니다. 쿼리에 단일 Enum 목록이 제공되면 반환 된 결과는 해당 Enum과 정확히 일치하고 해당 Enum과 다른 Enum으로 구성된 결과는 없습니다.

그러나에 따르면이 포스트 포함하는 요소와 일치하는 결과가 리턴되어야합니다. 또한안드로이드 문서 예상되는 동작이 내가 이해하는 한 동일하게 설명합니다. 나는 찾았다이 문제는 추적 비록 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");
}

다오

@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) 결과적으로 카멜레온이 아닌 카멜레온을 반환합니다.


  • 답변 # 1

    sergiy-tikhonov가 그의 의견에서 식별 한 것처럼 sql IN 연산자는 제공된 목록에서 단일 발생에 일치하는 결과 만 리턴합니다.

    'Type'목록을 포함하는 단일 열이 아닌 'Type'에 대해 각 항목에 두 개의 열을 할당하여 문제를 해결했습니다 (각 포켓몬은 테이블 간의 관계를 사용하지 않고 두 가지 유형 만 가질 수 있기 때문에 ). 각 항목에 기본 및 보조 유형을 할당하면 단일 유형 목록으로 두 열을 모두 쿼리 할 수 ​​있습니다.

    @Query("SELECT * from pokemon_table WHERE (type_primary IN (:types)) OR (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
    }
    
    

  • 이전 c# - 반사 - winform 컨트롤 수집
  • 다음 scala - 특정 보호 기능이있는 옵션 결과가 없음 인 경우 특정 코드 블록 실행