Android Room使用关系搜索和过滤,查询多个表

martinseal1987

如果您要发出请求请求,请在下面输入回购信息。

我已经为我的PokemonApp创建了一个Room数据库,我希望能够基于Pokemon名称和Pokemon类型来过滤和搜索该数据库。

我有一个用于Pokemon实体的表,一个用于PokemonType实体的表和一个用于PokemonTypeJoin实体的联结表,还有一个数据类PokemonWithTypes,它嵌入了一个Pokemon实体,并定义了它与PokemonType实体列表之间的关系。

宠物小精灵实体:

    @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的过滤器(字符串列表),其中任何PokemonWithTypes.types都与过滤器列表中的给定类型匹配?

因此,给定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注释不是针对该用例设计的。它仅设计为返回所有相关类型,而不是过滤后的子集。我认为您有3种选择:

  1. 只需使用Kotlin对其进行过滤:pokemonWithTypes.filter { it.types.contains("GRASS") }我假设您的口袋妖怪记录不超过10000条,因此性能不是问题。
  2. 编写联接查询。我认为这是可以忽略不计的性能提升的更多努力。
  3. 按照以下方式使用数据库视图:https : //issuetracker.google.com/issues/65509934这是更静态的,您必须为每种类型编写一个视图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Android房间关系搜索查询

来自分类Dev

Android Room @关系和索引

来自分类Dev

搜索和过滤Android ListView

来自分类Dev

Android Room和嵌套关系错误

来自分类Dev

Android搜索查询和排序

来自分类Dev

使用Android Room Database在同一张表中一对多关系

来自分类Dev

Android Studio Room和DAO:使用where'field = condition'参数进行查询

来自分类Dev

Android Studio Room和DAO:使用where'field = condition'参数进行查询

来自分类Dev

Android领域查询关系

来自分类Dev

Android中的关系查询

来自分类Dev

在android和php中搜索查询以搜索栏作为后端

来自分类Dev

Android Room查询:文本与搜索字符串完全匹配或以搜索字符串开头

来自分类Dev

使用php,mysql在android中使用参数搜索和检索表值

来自分类Dev

Android中使用ORMLITE的多个查询条件

来自分类Dev

使用Android Parse的多个组合“或”查询

来自分类Dev

在 Android Studio 中使用 Room 数据库关联表

来自分类Dev

MySQL查询来自多个表的搜索过滤器

来自分类Dev

MySQL查询来自多个表的搜索过滤器

来自分类Dev

如何使用ngFilter过滤和搜索表?

来自分类Dev

Android中的多个表

来自分类Dev

android:noHistory和android:finishOnTaskLaunch之间的关系

来自分类Dev

使用单个搜索参数查询Rails和Postgresql中的多个表和列

来自分类Dev

使用Android查询和AjaxCallback设置Cookie

来自分类Dev

使用Android查询和AjaxCallback设置Cookie

来自分类Dev

在 Firebase 中过滤数据(使用复杂查询)android

来自分类Dev

Android如何使用“喜欢”添加搜索建议 SQLite查询

来自分类Dev

使用linq to实体通过一个查询用特殊值搜索没有关系的多个表

来自分类Dev

Room SQLITE使用JOINS从多个表中删除查询

来自分类Dev

Android studio 如何使用多个词搜索数据库

Related 相关文章

  1. 1

    使用Android房间关系搜索查询

  2. 2

    Android Room @关系和索引

  3. 3

    搜索和过滤Android ListView

  4. 4

    Android Room和嵌套关系错误

  5. 5

    Android搜索查询和排序

  6. 6

    使用Android Room Database在同一张表中一对多关系

  7. 7

    Android Studio Room和DAO:使用where'field = condition'参数进行查询

  8. 8

    Android Studio Room和DAO:使用where'field = condition'参数进行查询

  9. 9

    Android领域查询关系

  10. 10

    Android中的关系查询

  11. 11

    在android和php中搜索查询以搜索栏作为后端

  12. 12

    Android Room查询:文本与搜索字符串完全匹配或以搜索字符串开头

  13. 13

    使用php,mysql在android中使用参数搜索和检索表值

  14. 14

    Android中使用ORMLITE的多个查询条件

  15. 15

    使用Android Parse的多个组合“或”查询

  16. 16

    在 Android Studio 中使用 Room 数据库关联表

  17. 17

    MySQL查询来自多个表的搜索过滤器

  18. 18

    MySQL查询来自多个表的搜索过滤器

  19. 19

    如何使用ngFilter过滤和搜索表?

  20. 20

    Android中的多个表

  21. 21

    android:noHistory和android:finishOnTaskLaunch之间的关系

  22. 22

    使用单个搜索参数查询Rails和Postgresql中的多个表和列

  23. 23

    使用Android查询和AjaxCallback设置Cookie

  24. 24

    使用Android查询和AjaxCallback设置Cookie

  25. 25

    在 Firebase 中过滤数据(使用复杂查询)android

  26. 26

    Android如何使用“喜欢”添加搜索建议 SQLite查询

  27. 27

    使用linq to实体通过一个查询用特殊值搜索没有关系的多个表

  28. 28

    Room SQLITE使用JOINS从多个表中删除查询

  29. 29

    Android studio 如何使用多个词搜索数据库

热门标签

归档