【问题标题】:Is it possible to use StringFormat or Constant Variable in android Room Query是否可以在 android Room Query 中使用 StringFormat 或 Constant Variable
【发布时间】:2018-11-20 05:39:34
【问题描述】:

我想使用公共常量变量Association.MEMBER_STATUS_APPROVED,通过以下房间查询来查询用户关联列表。

@Query("SELECT * FROM Association WHERE memberStatus = " + Association.MEMBER_STATUS_APPROVED)
LiveData<List<Association>> loadUserAssociations();

但是,房间在构建时给了我 [SQLITE_ERROR]。 可以通过将常量变量替换为如下参数来重写该查询。

@Query("SELECT * FROM Association WHERE memberStatus = :statusApproved")
LiveData<List<Association>> loadUserAssociations(String statusApproved);

我想知道 Room 是否支持这种字符串连接或字符串格式? (或)我可能错过了什么吗?

【问题讨论】:

  • 第二个应该可以工作..有什么错误吗?
  • 是的,@DKV。第二个有效。但是,我更喜欢第一个,我只想知道 Room 是否支持这种字符串连接或字符串格式。
  • 不,第一种类型是不可能的。
  • 谢谢@JeelVankhede。我认为 Room 应该支持这样 :-D 你怎么看? :-)
  • 不,其实这不是ROOM的错,但是你不能将变量传递给Annotations,它必须是静态的最终值。

标签: android database android-sqlite android-room


【解决方案1】:

对于那些有同样问题的人,以下可能是 Kotlin 中的解决方案:

@Query("SELECT * FROM Association WHERE memberStatus = :statusApproved")
loadUserAssociations(statusApproved: String = Association.MEMBER_STATUS_APPROVED): LiveData<List<Association>>

而且我认为它比硬编码或将明显的常量传递给函数更干净。

【讨论】:

  • 我们可以在查询中使用枚举,如下所示“SELECT * FROM Table WHERE status = STATES.RUNNING.ordinal()”
  • 不确定,但我希望您需要一个用于枚举的转换器。所以你的转换器可能看起来像这样: [at]TypeConverter fun toEnum(value: MyEnum?) = value?.let { enumValueOf(it) } [at]TypeConverter fun fromEnum(value: MyEnum?) = value?。名称不确定它是否有效,但请尝试一下。
【解决方案2】:

您可以像下面这样查询。

代替

@Query("SELECT * FROM Association WHERE memberStatus = " + Association.MEMBER_STATUS_APPROVED) LiveData&lt;List&lt;Association&gt;&gt; loadUserAssociations();

使用

@Query("SELECT * FROM Association WHERE memberStatus=${Association.MEMBER_STATUS_APPROVED}) LiveData&lt;List&lt;Association&gt;&gt; loadUserAssociations();

【讨论】:

  • 你有这个参考文档的链接吗?我无法在 $ 符号上获得“预期表达式”编译时错误
【解决方案3】:
  • 问题

如果您进行这样的查询,

"SELECT * FROM Association WHERE memberStatus = " + Association.MEMBER_STATUS_APPROVED

只是

"SELECT * FROM Association WHERE memberStatus = somevalue"

sql 无法知道“somvalue”是一个字符串。


  • 试试这个(用引号括起来)

"SELECT * FROM Association WHERE memberStatus = '" + Association.MEMBER_STATUS_APPROVED + "'"

【讨论】:

  • 我们可以在查询中使用枚举,如下所示“SELECT * FROM Table WHERE status = STATES.RUNNING.ordinal()”
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
相关资源
最近更新 更多