在Firebase中执行关键的特定查询

时间:2018-04-16 08:18:22

标签: android firebase firebase-realtime-database

我有这种方式的数据库结构

-... location
    -... messages
        -... id1_id2
        -... id3_id4
        -... id5_id6
        .
        .
        .

如何在消息中访问对象,我知道id1是关键。

TIA。

3 个答案:

答案 0 :(得分:3)

将您的数据库更改为:

Messages
   userid1
     userid2
        message: hello

然后检索message,执行以下操作:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Messages").child(userid1);
ref.addListenerForSingleValueEvent(new ValueEventListener(){
  @Override
public void onDataChange(DataSnapshot dataSnapshot){
  for (DataSnapshot ds : dataSnapshot.getChildren()) {
    String messages=ds.child("message").getValue().toString();


    }
  }
});

答案 1 :(得分:1)

假设您的结构是这样的:

enter image description here

你可以做这样的事情,这将从开始获取消息的所有节点 id1

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <relativePath />
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.projectreactor</groupId>
    <artifactId>reactor-spring</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-core</artifactId>
    <version>3.1.6.RELEASE</version>
</dependency>  
<dependency>
    <groupId>io.projectreactor.addons</groupId>
    <artifactId>reactor-test</artifactId>
    <version>3.0.7.RELEASE</version>
</dependency>

我从javascript implementation中获取了这个想法,但它也适用于Android,我在我的设备/数据库上运行测试。请注意,此方法可用于获取具有给定ID的启动的数据。

修改

这个官方post讨论了查询包含某个字符串的firebase数据的想法。此外,这也是question。最重要的是api不支持这些类型的查询,我上面提到的方法是你能够实现最接近&#34; SQL LIKE&#34;在火基地。目前,没有办法搜索END与另一个字符串的字符串。 endAt并不意味着字符串以id1结尾,而是我想要检索的值的范围在(id1 +&#34; \ uf8ff&#34;)结束,这意味着任何以id1开头的字符串。 您可以选择更改架构或抓取所有消息并在本地搜索(其他两个答案的建议)。

答案 2 :(得分:0)

试试这个

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/messages");
ref.addListenerForSingleValueEvent(new ValueEventListener(){

@Override
public void onDataChange(DataSnapshot dataSnapshot){
   for (DataSnapshot ds : dataSnapshot.getChildren()) {
     if(ds.getKey().contains("bob")){
           //Do something with the date
           break;
       }
     }
   }
});