관계를 사용하여 Android Room 검색 및 필터링, 여러 테이블 쿼리

martinseal1987

풀 리퀘스트를 발행하려면 Repo가 아래에 있습니다.

PokemonApp에 대한 Room 데이터베이스를 만들었습니다. Pokemon 이름과 Pokemon 유형에 따라 데이터베이스를 필터링하고 검색 할 수 있기를 원합니다.

내 Pokemon 엔터티에 대한 테이블, PokemonType 엔터티에 대한 테이블 및 PokemonTypeJoin 엔터티에 대한 접합 테이블이 있습니다. 또한 Pokemon 엔터티를 포함하고 이것과 PokemonType 엔터티 목록 간의 관계를 정의하는 데이터 클래스 PokemonWithTypes도 있습니다.

포켓몬 엔티티 :

    @TypeConverters(RoomStringListConverter::class)
    @Entity
    data class Pokemon(
        @NotNull
        @PrimaryKey
        @ColumnInfo(name = POKEMON_ID)
        var id: Int,
    
        @ColumnInfo(name = POKEMON_NAME)
        var name: String,
    
        @ColumnInfo(name = POKEMON_URL)
        var url: String,
    
        @ColumnInfo(name = POKEMON_WEIGHT)
        val weight: Int,
    
        @ColumnInfo(name = POKEMON_HEIGHT)
        val height: Int,
    
        @ColumnInfo(name = POKEMON_SPECIES)
        var species: String,
    
        @ColumnInfo(name = POKEMON_MOVES)
        val moves: List<String>
    
    ) 

    const val POKEMON_ID: String = "pokemon_id"
    const val POKEMON_NAME: String = "pokemon_name"
    const val POKEMON_URL: String = "pokemon_url"
    const val POKEMON_HEIGHT: String = "pokemon_height"
    const val POKEMON_WEIGHT: String = "pokemon_weight"
    const val POKEMON_MOVES: String = "pokemon_moves"
    const val POKEMON_SPECIES: String = "pokemon_species"

PokemonType 엔티티 :

    @Entity
    data class PokemonType (
    
        @NotNull
        @PrimaryKey
        @ColumnInfo(name = POKEMON_TYPE_ID)
        var id: Int,
    
        @ColumnInfo(name = POKEMON_TYPE_NAME)
        var name: String,
    
        @ColumnInfo(name = POKEMON_TYPE_SLOT)
        var slot: Int
    
    )

    const val POKEMON_TYPE_ID: String = "type_id"
    const val POKEMON_TYPE_NAME: String = "type_name"
    const val POKEMON_TYPE_SLOT: String = "type_slot"

PokemonTypesJoin 엔티티 :

    @Entity(primaryKeys = [POKEMON_ID, POKEMON_TYPE_ID])
    class PokemonTypesJoin(
        @NotNull
        @ColumnInfo(name = POKEMON_ID, index = true)
        val pokemon_id: Int,
    
        @NotNull
        @ColumnInfo(name = POKEMON_TYPE_ID, index = true)
        val pokemon_type_id: Int
    
    )
    
    const val POKEMON_ID: String = "id"
    const val POKEMON_TYPE_ID: String = "type_id"

PokemonWithTypes 클래스

    data class PokemonWithTypes(
        @Embedded
        val pokemon: Pokemon,
        @Relation(
            parentColumn = Pokemon.POKEMON_ID,
            entity = PokemonType::class,
            entityColumn = PokemonType.POKEMON_TYPE_ID,
            associateBy = Junction(
                value = PokemonTypesJoin::class,
                parentColumn = PokemonTypesJoin.POKEMON_ID,
                entityColumn = PokemonTypesJoin.POKEMON_TYPE_ID
            )
        )
        val types: List<PokemonType>
    )

이 구조가 주어지면 다음 쿼리를 사용하여 pokemon_name으로 모든 PokemonWithTypes를 가져오고 검색 할 수 있습니다.

@Transaction
@Query("SELECT * FROM pokemon WHERE pokemon_name LIKE :search ORDER BY pokemon_id ASC")
fun getPokemonWithTypes(search: String?): LiveData<List<PokemonWithTypes>>

하지만 이제 PokemonWithTypes.types가 필터 목록의 지정된 유형과 일치하는 PokemonWithTypes 만 반환하는 필터 (문자열 목록)를 추가하려면 어떻게해야합니까?

그래서 주어진 3 개의 포켓몬 (간결성을 위해 일부 데이터가 제거됨)

PokemonWithTypes(pokemon=Pokemon(id=1, name=bulbasaur, types=[PokemonType(id=4, name=poison, slot=2), PokemonType(id=12, name=grass, slot=1)])
PokemonWithTypes(pokemon=Pokemon(id=4, name=charmander, types=[PokemonType(id=10, name=fire, slot=2), PokemonType(id=12, name=grass, slot=1)])
PokemonWithTypes(pokemon=Pokemon(id=7, name=squirtle, types=[PokemonType(id=11, name=water, slot=2), PokemonType(id=12, name=grass, slot=1)])

현재 모든 포켓몬을 얻고 pokemon_name으로 검색 할 수 있지만 물 유형 또는 잔디 유형 만 표시 할 수 있기를 바랍니다.

나는 다음과 같은 쿼리로 문자열 목록 대신 문자열을 필터링하려고 시도했습니다.

@Transaction
@Query("SELECT * FROM pokemon, pokemonType WHERE type_name LIKE :filter AND pokemon_name LIKE :search ORDER BY pokemon_id ASC")
fun getPokemonWithTypes(search: String?, filter: String): LiveData<List<PokemonWithTypes>>

하지만 작동하지 않았다

https://github.com/martipello/PokeApp/tree/add_filters 에서 전체 내용을 확인할 수 있습니다.

카슨 홀츠 하이머

@Relation 주석은 해당 사용 사례에 맞게 설계되지 않았다고 생각합니다. 필터링 된 하위 집합이 아닌 모든 관련 유형을 반환하도록 설계되었습니다. 세 가지 옵션이 있다고 생각합니다.

  1. Kotlin으로 필터링하면됩니다 pokemonWithTypes.filter { it.types.contains("GRASS") }.. 나는 당신이 포켓몬의 기록이 10000 개를 넘지 않는다고 가정하므로 성능은 문제가되지 않습니다.
  2. 조인 쿼리를 작성합니다. 미미한 성능 향상을위한 더 많은 노력이라고 생각합니다.
  3. https://issuetracker.google.com/issues/65509934에 따라 데이터베이스보기를 사용합니다 . 이것은 더 정적이고 모든 유형에 대한 뷰를 작성해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

조인을 사용하여 피벗 테이블 및 관련 데이터를 검색하는 Eloquent 쿼리

분류에서Dev

여러 테이블의 검색 필터에 대한 MySQL 쿼리

분류에서Dev

Room SQLITE JOINS를 사용하여 여러 테이블에서 쿼리 삭제

분류에서Dev

php, mysql을 사용하여 android에서 매개 변수를 사용하여 테이블 값 검색 및 검색

분류에서Dev

"Android Studio에서 커서를 사용하여 여러 테이블에서 데이터를 검색하는 방법"

분류에서Dev

텍스트 상자를 사용하여 필터링 및 검색

분류에서Dev

linq to entity를 사용하여 하나의 쿼리로 특수 값으로 관계가없는 여러 테이블 검색

분류에서Dev

SQL Server 2008을 사용하여 4 개의 테이블에서 쿼리 데이터를 검색하십니까?

분류에서Dev

xamarin.android를 사용하여 Azure 테이블 및 출력 쿼리

분류에서Dev

HABTM 조인 테이블의 데이터를 사용하여 CakePHP 2.x 검색 / 쿼리

분류에서Dev

Node JS 및 MongoDB를 사용하여 쿼리 필터링

분류에서Dev

Django 쿼리를 사용하여 여러 테이블에서 세부 정보 검색

분류에서Dev

Android Studio Room 및 DAO : 'field = condition'인수를 사용하여 쿼리 만들기

분류에서Dev

여러 조건이있는 두 테이블에서 데이터를 검색하는 SQL Server 쿼리

분류에서Dev

텍스트 상자 및 드롭 다운 목록을 사용하여 테이블을 검색하여 데이터베이스 필터링 (실시간 검색)

분류에서Dev

CakePHP 3.1.0 용 FriendsOfCake 검색 플러그인을 사용하여 관련 데이터를 필터링하는 방법

분류에서Dev

여러 테이블에서 여러 행 가져 오기 및 하나의 MySQL 쿼리를 사용하여 정렬

분류에서Dev

Laravel에서 관계를 사용하여 데이터 검색

분류에서Dev

Entity Framework Core를 사용하여 조인 된 테이블에서 여러 OR 및 필터로 쿼리를 표현합니다.

분류에서Dev

SQL 쿼리를 사용하여 데이터 세트 필터링

분류에서Dev

JSON 및 MySql을 사용하여 Android 앱을 사용하여 데이터 검색

분류에서Dev

AND 및 OR을 사용하여 쿼리로 여러 행 검색

분류에서Dev

vba를 사용하여 여러 Outlook 폴더 검색 및 이동

분류에서Dev

여러 AND를 사용하여 SQL 쿼리 필터링

분류에서Dev

Android Room Database를 사용하여 동일한 테이블 내에서 일대 다 관계

분류에서Dev

PyQT5 및 여러 열을 사용하여 테이블 필터링

분류에서Dev

Angular $ filter를 사용하여 깊은 json 값을 검색 및 필터링

분류에서Dev

여러 쿼리 매개 변수 및 외래 키를 사용한 DRF 필터링

분류에서Dev

이와 같은 SQL 쿼리를 사용하여 백엔드에서 답변 및 질문 테이블을 검색하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    조인을 사용하여 피벗 테이블 및 관련 데이터를 검색하는 Eloquent 쿼리

  2. 2

    여러 테이블의 검색 필터에 대한 MySQL 쿼리

  3. 3

    Room SQLITE JOINS를 사용하여 여러 테이블에서 쿼리 삭제

  4. 4

    php, mysql을 사용하여 android에서 매개 변수를 사용하여 테이블 값 검색 및 검색

  5. 5

    "Android Studio에서 커서를 사용하여 여러 테이블에서 데이터를 검색하는 방법"

  6. 6

    텍스트 상자를 사용하여 필터링 및 검색

  7. 7

    linq to entity를 사용하여 하나의 쿼리로 특수 값으로 관계가없는 여러 테이블 검색

  8. 8

    SQL Server 2008을 사용하여 4 개의 테이블에서 쿼리 데이터를 검색하십니까?

  9. 9

    xamarin.android를 사용하여 Azure 테이블 및 출력 쿼리

  10. 10

    HABTM 조인 테이블의 데이터를 사용하여 CakePHP 2.x 검색 / 쿼리

  11. 11

    Node JS 및 MongoDB를 사용하여 쿼리 필터링

  12. 12

    Django 쿼리를 사용하여 여러 테이블에서 세부 정보 검색

  13. 13

    Android Studio Room 및 DAO : 'field = condition'인수를 사용하여 쿼리 만들기

  14. 14

    여러 조건이있는 두 테이블에서 데이터를 검색하는 SQL Server 쿼리

  15. 15

    텍스트 상자 및 드롭 다운 목록을 사용하여 테이블을 검색하여 데이터베이스 필터링 (실시간 검색)

  16. 16

    CakePHP 3.1.0 용 FriendsOfCake 검색 플러그인을 사용하여 관련 데이터를 필터링하는 방법

  17. 17

    여러 테이블에서 여러 행 가져 오기 및 하나의 MySQL 쿼리를 사용하여 정렬

  18. 18

    Laravel에서 관계를 사용하여 데이터 검색

  19. 19

    Entity Framework Core를 사용하여 조인 된 테이블에서 여러 OR 및 필터로 쿼리를 표현합니다.

  20. 20

    SQL 쿼리를 사용하여 데이터 세트 필터링

  21. 21

    JSON 및 MySql을 사용하여 Android 앱을 사용하여 데이터 검색

  22. 22

    AND 및 OR을 사용하여 쿼리로 여러 행 검색

  23. 23

    vba를 사용하여 여러 Outlook 폴더 검색 및 이동

  24. 24

    여러 AND를 사용하여 SQL 쿼리 필터링

  25. 25

    Android Room Database를 사용하여 동일한 테이블 내에서 일대 다 관계

  26. 26

    PyQT5 및 여러 열을 사용하여 테이블 필터링

  27. 27

    Angular $ filter를 사용하여 깊은 json 값을 검색 및 필터링

  28. 28

    여러 쿼리 매개 변수 및 외래 키를 사용한 DRF 필터링

  29. 29

    이와 같은 SQL 쿼리를 사용하여 백엔드에서 답변 및 질문 테이블을 검색하는 방법은 무엇입니까?

뜨겁다태그

보관