Firebase 当我获取一个子节点并访问其数据时,我还将查询哪些数据?

Firebase 当我获取一个子节点并访问其数据时,我还将查询哪些数据?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,假设我有如上所述的firebase数据结构,现在我尝试使用child(“id1”)…value()获取第一个id的值(例如它的名称)。我是否可能访问和查询“id2”或同一级别上的其他节点的数据 除去在数据库中存储数据的成本,当“消息”中的节点数开始增加时,查询单个节点(获取其所有内部值)是否会花费更多?您必须这样做,因为您希望所有子值都位于同一级别上 {message:{ "id1":{ "name":"name1" }, "id2":{ "name":"name2" }

假设我有如上所述的firebase数据结构,现在我尝试使用child(“id1”)…value()获取第一个id的值(例如它的名称)。我是否可能访问和查询“id2”或同一级别上的其他节点的数据


除去在数据库中存储数据的成本,当“消息”中的节点数开始增加时,查询单个节点(获取其所有内部值)是否会花费更多?

您必须这样做,因为您希望所有子值都位于同一级别上

{message:{
  "id1":{
    "name":"name1"
},
  "id2":{
    "name":"name2"
},
  "id3":{
    "name":"name3"
}... and so on
}}
另一种方法是,您可以获得消息的全部数据,然后您可以通过该方法获得每个子数据

firebase.child("message").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot innerDataSanpShot : dataSnapshot.getChildren()) {
      //DataSnapshot of inner Childerns mean id1, id2.... so on
      String name = innerDataSnapShot.child("name").getValue().toString();
     } 
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

您必须这样做,因为您希望所有子值位于同一级别

{message:{
  "id1":{
    "name":"name1"
},
  "id2":{
    "name":"name2"
},
  "id3":{
    "name":"name3"
}... and so on
}}
另一种方法是,您可以获得消息的全部数据,然后您可以通过该方法获得每个子数据

firebase.child("message").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot innerDataSanpShot : dataSnapshot.getChildren()) {
      //DataSnapshot of inner Childerns mean id1, id2.... so on
      String name = innerDataSnapShot.child("name").getValue().toString();
     } 
}

@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

在不了解您的目标平台的情况下,我将假定它是一个基于web的应用程序。为了在相关节点上执行数据查询,您可以执行以下操作:

   dataSnapshot.child("id1"). getValue();
这个简单的示例将显示该特定位置的消息,您需要用正确的格式替换“id1”。您将不会调用其他级别的数据,因为您使用“id1”值来精确定位要从中查询数据的节点


关于第二个问题,我不认为随着数据库的增长查询单个节点会增加成本,前提是您在特定位置进行查询。当然,如果您添加了一个循环,那么这将根据数据库的大小而改变情况。

在不了解目标平台的情况下,我将假定它是一个基于web的应用程序。为了在相关节点上执行数据查询,您可以执行以下操作:

   dataSnapshot.child("id1"). getValue();
这个简单的示例将显示该特定位置的消息,您需要用正确的格式替换“id1”。您将不会调用其他级别的数据,因为您使用“id1”值来精确定位要从中查询数据的节点


关于第二个问题,我不认为随着数据库的增长查询单个节点会增加成本,前提是您在特定位置进行查询。当然,如果您添加一个循环,那么这将根据数据库的大小而改变情况。

这不是我的问题,在我的例子中,我希望避免接触“id1”以外的节点。我感兴趣的是,无论属于哪个聊天室,让主节点“消息”存储所有消息是否合适。如果我已经有特定的聊天室ID来存储它属于哪个messageid。这不是我真正的问题,在我的例子中,我想避免接触“id1”以外的节点。我感兴趣的是,无论属于哪个聊天室,让主节点“消息”存储所有消息是否合适。如果我已经有特定的聊天室ID来存储它所属的messageid,你可以在你的应用程序中维护一个数据结构,在构造器中读取一次,然后在需要时随时更新你的数据。并在应用程序结束时更新firebase。但这样一来,您就失去了实时功能—您可以在应用程序中维护数据结构,在构造函数中读取一次,然后在需要时随时更新数据。并在应用程序结束时更新firebase。但是这样你就失去了实时功能