Java 在Firebase中执行特定于密钥的查询

Java 在Firebase中执行特定于密钥的查询,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有这样的数据库结构 -... location -... messages -... id1_id2 -... id3_id4 -... id5_id6 . . . 我如何访问消息中的对象,而我只知道id1是键 TIA.试试这个 DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/mes

我有这样的数据库结构

-... location
    -... messages
        -... id1_id2
        -... id3_id4
        -... id5_id6
        .
        .
        .
我如何访问消息中的对象,而我只知道
id1
是键

TIA.

试试这个

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;
       }
     }
   }
});

将数据库更改为:

Messages
   userid1
     userid2
        message: hello
然后,要检索
消息
,请执行以下操作:

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();


    }
  }
});

假设您的结构如下所示:

您可以这样做,这将从使用id1启动的消息中抓取所有节点:

String id1 = "id1";
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("messages");
        ref.orderByKey().startAt(id1).endAt(id1 + "\uf8ff").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()) {
                    Log.d("SNAP", snap.getValue(String.class));
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
我从javascript中得到了这个想法,但它在Android中也起作用,我已经在我的设备/数据库上运行了一个测试。请注意,此方法将用于获取以给定id开头的数据

编辑:

本文讨论了查询包含特定字符串的firebase数据的想法。还有这个。底线是api不支持这些类型的查询,我上面提到的方法是在firebase中实现“类似SQL”的最接近的方法。目前,无法搜索以另一个字符串结尾的字符串。endAt并不表示字符串以id1结尾,而是表示我要检索的值的范围以(id1+“\uf8ff”)结尾,这意味着任何以id1开头的字符串。
您可以选择更改模式或抓取所有消息并在本地搜索(其他两个答案的建议)。

数据库中的id2是什么?id1_id2是识别两个ID之间对话的组合。您需要知道id1_id2才能访问,正如我之前所说,您需要更改数据库structure@kashyapjimuliya什么意思?Levi的答案总是以
id1
开头。这是我在本地做的,但这需要使用查询直接在数据库上完成,因为有很多不必要的数据使用了我的firebase数据库带宽。我不能在这里更改模式。而且,我无法获得通过
id2
发送的消息。如果您不想更改方案,那么仅使用id1将不起作用。如果您可以同时拥有这两个ID,那么您可以执行
orderByChild(“id1\u id2”).equalTo(这些ID)
。但是无论如何,你想检索什么呢?我计划检索这个对象中的聊天数组。无论如何,非常感谢你的帮助。正如您所说,只有
id1
不起作用,但同样,除了获取整个数据库并对其进行相应过滤之外,没有其他方法可以这样做。最好不要使用数组,但是,是的,在这种情况下,这是唯一的方法。您的回答很有帮助。但是我不能把它标记为正确,因为我的问题仍然需要令人信服的答案。使用
endAt()
可以实现同样的效果吗?