【问题标题】:How to search in firebase database如何在firebase数据库中搜索
【发布时间】:2021-11-01 06:06:39
【问题描述】:

我正在尝试使用以下代码从我的数据库中过滤数据:

fdb.orderByChild("title").startAt(searchquery).endAt(searchquery+"\uf8ff").addValueEventListener(valuelistener2);

我的数据库是这样的:

  "g12" : {
    "Books" : {
      "-Mi_He4vHXOuKHNL7yeU" : {
        "title" : "Technical Sciences P1"
      },
      "-Mi_He50tUPTN9XDiVow" : {
        "title" : "Life Sciences"
      },
      "-Mi_He51dhQfl3RAjysQ" : {
        "title" : "Technical Sciences P2"
      }}

虽然代码有效,但它只返回与查询匹配的第一个值,即使匹配也不会获取其余数据。

如果我将“T”作为搜索查询,我只会得到第一个标题“技术科学 P1”,而不会用 P2 得到另一个标题

(抱歉,问题标题含糊而常见,只是我一直在寻找解决方案这么久)

【问题讨论】:

  • 您的代码匹配所有titlesearchquery 值开头的节点。如果您没有看到您期望的结果,请编辑您的问题以包括:1)您用于处理结果的valuelistener2 2)我们可以用来重现问题的searchquery 的值 3)您希望返回的fdb 处的 JSON(作为文本,请不要截图)。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案1】:

虽然代码有效,但它只返回与查询匹配的第一个值

这是预期的行为,因为 Firebase 实时数据库支持本机索引或在数据库属性中搜索文本字段。

当您使用以下查询时:

fdb.orderByChild("title").startAt(searchquery).endAt(searchquery+"\uf8ff")

这意味着您正在尝试获取以searchquery 开头的所有元素。例如,如果您有一个名为“Don Quixote”的标题并且您搜索“Don”,您的查询将返回正确的结果。但是,搜索“Quix”不会产生任何结果。

您可能会考虑下载整个节点以在客户端搜索字段,但这种解决方案根本不实用。要启用 Firebase 实时数据库数据的全文搜索,我建议您使用第三方搜索服务,例如 AlgoliaElasticsearch

如果您考虑在某个时间点尝试使用Cloud Firestore,请参阅以下示例:

要了解它如何与 Cloud Firestore 一起使用,但以同样的方式,您可以将它与 Firebase 实时数据库一起使用。

【讨论】:

  • 谢谢亚历克斯先生,我编辑了我的问题...我希望现在很清楚
  • fdb 是如何定义的?当只返回第一个元素时,您使用的searchquery 的值是多少?
  • ?对不起,我在 java 中的应用并不广泛,因为我使用的是草图软件,出于测试目的,我输入的 searchquery 值是“Tech”和“T”。我用过这个教程:sketchwarehelp.com/2020/06/…
  • fdb是如何定义的?
  • ?对不起,我忘记了这个问题,是的,我有点解决了。我从头开始重新创建了活动,这次它起作用了......我不确定问题是什么,虽然编码粗心,但感谢您检查我 Alex❤️
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多