【问题标题】:Room Dao query for fixed Object固定对象的房间道查询
【发布时间】:2021-06-25 03:42:59
【问题描述】:

最近我遇到了需要查询特定对象类型但没有通过方法传递它的情况,我找不到任何方法。所以我想做一些类似的事情:

@Query(" select * from table_a where type = ENUM_A")
fun queryForTypeA()

但它的替代方法是可行的,但我不想传递任何东西。

@Query(" select * from table_a where type =:type")
fun queryForTypeA(type: EnumType = ENUM_A)

问题是,如果我在其他一些查询中找到正确的方法,我想排除其他一些 ENUM,所以传入函数在那里不起作用并且没有意义。我想实现这样的目标:

@Query(" select * from table_a where type NOT ENUM_A")
fun queryForAllTypesExceptA()

【问题讨论】:

    标签: android sql android-room


    【解决方案1】:

    尝试更改第二种方法,但为 type 定义一个默认值,例如:

    @Query(" select * from table_a where type =:type")
    fun queryForTypeA(type: EnumType = EnumType.A)
    

    这样您就不必在调用站点为type 指定值。

    【讨论】:

    • 我也这样做了,但没有提及。所以寻找传递硬编码值来查询。原因是在某些查询中我想排除其他一些查询,所以我必须在排除查询中添加枚举列表,这样没有意义。
    【解决方案2】:

    枚举是静态常量,但不是编译时常量。只是 像任何其他类一样,枚举在第一次需要时加载。

    您不能为@Query 动态定义参数 注释。

    您可以将您的类型放入类的 companion 对象中,也可以使用像 here 这样的密封类

    @Query(" select * from table_a where type"+ "="+ companionEnum_a) 
    fun queryForTypeA() 
    

    确保您的同伴Enum_a 是编译时常量。那应该是const val companionEnum_a

    【讨论】:

    • 你能给我你的配额评论的来源链接吗?
    • 当然,让我试试你的解决方案。
    • 如果您的意思是创建缩放类并将其放入伴随对象中,我仍然得到“注释参数必须是编译时”并且仍然无法将它们放入查询中。:(
    • 你可以使用普通类和伴生对象
    【解决方案3】:

    Okey 经过多次尝试后,我发现我可以将在类型转换器中创建的对象或枚举等值作为固定字符串传递。 因为保存复杂类或枚举的最佳方法是将它们保存为字符串,所以我们创建了两种方法,一种是fromString(value: String):MyEnum,第二种是 typeConvertor 类中的toString(value:MyEnum):String

    似乎 Room 可以使用类型转换器转换该字符串值。 所以我改成这样,它的工作原理:

    @Query(" select * from table_a where type != 'ENUM_A' ")
    fun queryForAllTypesExceptA()
    

    还有一点NOT 不起作用,你必须使用!=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多