【问题标题】:Android Room DB - use static variable from another class in queryAndroid Room DB - 在查询中使用来自另一个类的静态变量
【发布时间】:2019-02-18 14:08:13
【问题描述】:

当我在 DAO 类中编写查询时,我可以使用来自另一个类(或枚举)的静态变量吗?如果可能,请告诉我如何?

我的意思是这样的:

public enum MessageState {
   NOTHING,
   PENDING,
   SEND
}

在DAO类的查询语句中:

@Query("SELECT * FROM message_db WHERE state = :MessageState.PENDING.ordinal()")

【问题讨论】:

  • 你有没有尝试过以下方式:@Query("SELECT * FROM message_db WHERE state = :msgState") List<Messages> getMessageByState(MessageState msgState);
  • @ankuranurag2 实际上我的查询是@Query("SELECT * FROM message_db WHERE state = 1 OR state =2"),这样你说我必须总是通过两个MessageState,它无处不在。我认为这不是最好的方法,但非常感谢您的回复

标签: android android-room android-jetpack


【解决方案1】:

将您的枚举作为默认参数传递给函数:

@Query("SELECT * FROM message_db WHERE state = :state")
fun getMessages(state: Int = MessageState.PENDING.ordinal()): List<Message>

这样您就不需要在每次调用时都提供它,但可以获得相同的结果。

【讨论】:

  • 这是 kotlin 中的好方法,但我的项目是用 java 编写的。 java中是否有这种方式?
  • 抱歉,没注意到。也许在 Java 中,您可以利用 Java 8 中引入的方法重载和默认接口方法。
【解决方案2】:

你可以像普通的字符串一样连接它,在 Java 中:

@Query("SELECT * FROM message_db WHERE state = " + MessageState.PENDING.ordinal() + ")"

如果您使用的是 Kotlin:

@Query("SELECT * FROM message_db WHERE state = ${MessageState.PENDING.ordinal()}")

【讨论】:

  • 我试过这个但它给了我错误Attribute value must be constant
  • 你需要ordinal方法调用吗?如果删除它会发生什么? (MessageState.PENDING)
  • 好的,我认为这没关系,但似乎你不能在annotation 中使用enum,它们在编译时不是恒定的,所以你应该使用真正的编译-时间常数。也许您可以找到一种解决方法,但我无法为您提供建议。
  • 非常感谢您的回复和提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多