如何在Firebase实时数据库Android中实现等效的.contains(SomeText)?

时间:2017-06-14 11:27:32

标签: android firebase firebase-realtime-database

我想让我的用户在我的Firebase实时数据库中搜索一些内容。问题是Firebase查询只允许我使用endAt()和startAt()搜索/过滤结果。例如,让我的用户搜索" rro" ,然后我的搜索视图应该生成建议为"箭头" (查看我的数据库后,如果找到带箭头的条目)。

我能够自己在searchview中提出建议,但问题是.startAt()和.endAt()无法实现/或找不到任何内容,如果" rro"提供。我希望过滤器像.contains();

如何在Firebase for Android中实现这一目标?

2 个答案:

答案 0 :(得分:1)

对于这种情况,我发现了一个更好的答案,不需要创建特殊结构:

  

FirebaseDatabase.getInstance().getReference("users").orderByChild("LastName").startAt(queryText).endAt(queryText+"\uf8ff");
  

查询中使用的字符\ uf8ff是一个很高的代码点   Unicode范围(这是专用区域[PUA]代码)。因为它   在Unicode中的大多数常规字符之后,查询将匹配所有   以queryText开头的值。

     

这样,通过“ Fre”搜索,我可以获得具有“ Fred”的记录,   “ Freddy,Frey”作为数据库中LastName属性中的值。

最初的答案是里兹万·汗(Rizwan Khan)。 链接:https://www.quora.com/How-would-you-search-a-Firebase-Realtime-Database-with-a-substring

答案 1 :(得分:0)

制作这样的结构

- objects
  - UID1:Arrow
  - UID2:Rowboat
  - UID3:Bow
- searchable
  - arrow
    - UID1
  - rrow
    - UID1
  - row
    - UID1
    - UID2
  - ow
    - UID1
    - UID2
    - UID3
  - w
    - UID1
    - UID2
    - UID3
  - rowboat
    - UID2
  - owboat
    - UID2
  - wboat
    - UID2
  - boat
    - UID2
  - oat
    - UID2
  - oa
    - UID2
  - a
    - UID1
    - UID2
  - bow
    -UID3

然后它很容易搜索,只需使用像

这样的查询
FirebaseDatabase.getInstance().getReference().child("searchable").orderByKey().startAt(input).endAt(input+"~");

当您创建像箭头一样的对象时,您必须使用.updateChildren(),您可以在其中添加可搜索的条目。此外,当箭头更改名称时,您必须以可搜索的方式更新,我建议将所有内容转换为小写,搜索文本和可搜索的对象名称。