【问题标题】:Why Android Room @Query LIKE is not returning data known to exist为什么 Android Room @Query LIKE 不返回已知存在的数据
【发布时间】:2020-02-14 13:27:51
【问题描述】:

我的问题:我不确定为什么这个 Android Room 查询没有返回结果。我以为我理解了正确的编码,而且看起来很简单。如果我使用 SQLiteStudio 将相同的查询直接传递到相同的数据库,我会得到结果。

调用代码(我硬编码字符串'truth'来测试它):

List<Integer> tableIDs = researchDatabase.getCommentsDao().customSearchCommentsTable("truth");

DAO 代码(包含在 CommentsDao 中):

@Query("SELECT CommentID FROM Comments WHERE Comment LIKE :value")
List<Integer> customSearchCommentsTable(String value);

我做了什么:我是 Android Room 的新手,但我一直在使用 Android 开发人员 (developer.android.com) 的所有示例和课程,并在此处查看和应用了许多帖子stackoverflow 密切相关,但我无法返回任何结果。当我单步执行代码时,实际的 Android Room 代码似乎没有将变量字符串绑定到语句,尽管我可以看到参数字符串被识别并正确传递,这不是我编写的代码,或者至少不是我从来没有看到带有我的变量数据的结果绑定字符串,我只看到这个:

SELECT CommentID FROM Comments WHERE Comment LIKE ?

我的目标是什么:这实际上是创建查询以处理与此类似的多个 LIKE 查询的第一步,我认为这需要 @RawQuery 设置。现在,我无法让简单的事情发挥作用。

@Query 包装器中发生的情况:我意识到我在这里可能是天真和错误的,但在下面我可以看到参数和语句都通过了,但看起来好像“_statement.bindString”实际上没有绑定":value" ('truth') 到语句并返回 0 个结果。

【问题讨论】:

  • 仅供观众参考:2020 年 2 月 14 日在此问题上开票,随后在 2020 年 3 月 2 日转发给 Room development,作为可能的缺陷。解决此问题后,我将在此处发布任何更新。 (票务网址:issuetracker.google.com/149519050
  • 仅供观众参考:房间开发否认我提出的票证存在问题,并且本质上表示不应按字面意思理解所提供的示例。他们提供了一个应该使用的解决方案,其中涉及连接通配符。在我看来,99% 的官方 Android Room 开发代码都是按字面意思提供的,或者说提供它的目的是什么。关于他们的回应和我的看法,这仍然是他们拒绝在文档中或以编程方式纠正的错误。
  • 习惯这种事情。 Google 对 Android 错误报告的处理只能被定性为非常无能。

标签: java android-sqlite android-room


【解决方案1】:

这是Android Room开发团队提供的解决方案:

@Query("SELECT CommentID FROM Comments WHERE Comment LIKE '%' || :value || '%'")
List<Integer> customSearchCommentsTable(String value);

具有讽刺意味的是,开发团队无法让他们发布的代码示例正常工作。到他们回复时,我已经创建了一个解决方法,使用 @RawQuery 方法来创建正确的 SQL 语法。

【讨论】:

  • 谢谢。这是唯一有效的答案。对我帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2019-05-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多