Java 如何查询firebase数据库以返回值';s键';s的父母';谁的父母?
我正在开发一个团队聊天应用程序。我正在firebase中存储聊天数据 这是我的数据结构Java 如何查询firebase数据库以返回值';s键';s的父母';谁的父母?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个团队聊天应用程序。我正在firebase中存储聊天数据 这是我的数据结构 聊天记录存储在名为chats的节点下 chats的每个直接子项都是一个团队的名称(如whatsapp..chat groups) 团队节点包含所有聊天信息。聊天信息被存储 父节点的格式为时间戳\u chat 我的问题 现在,我必须创建一个firebase查询,通过从键获取此团队节点 就是 如果from:字段包含给定搜索值(如“ragesh”),则必须将父节点“team_name”作为数据快照返回(如“te
- 聊天记录存储在名为
的节点下李>chats
的每个直接子项都是一个团队的名称(如whatsapp..chat groups)李>chats
节点包含所有聊天信息。聊天信息被存储团队
- 父节点的格式为
时间戳\u chat
from:
字段包含给定搜索值(如“ragesh”),则必须将父节点“team_name”作为数据快照返回(如“teamrova”)
简单地说,我想要在from
字段中具有特定用户名的团队的datasnapshot
我的工作
我尝试了以下代码:
reference1 = FirebaseDatabase.getInstance().getReference().child("chats");
Query chatQuery = reference1.orderByChild("from").equalTo("ragesh");
System.out.println("Chat list :: starting");
chatQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("Chat list :: onChildAdded");
for (DataSnapshot chat : dataSnapshot.getChildren()) {
HashMap<String, Object> hashMap = (HashMap<String, Object>) dataSnapshot.getValue();
System.out.println("Chat list :: The chat group is =>" + dataSnapshot.getKey());
System.out.println("Chat list :: The key & Value => " + chat.getKey() +" :: "+chat.getValue().toString());
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(ChatListActivity.this, "Connection Error "+databaseError.getDetails(), Toast.LENGTH_SHORT).show();
System.out.println("Chat list :: databaseError "+databaseError.toString());
}
});
reference1=FirebaseDatabase.getInstance().getReference().child(“聊天”);
Query chatQuery=reference1.orderByChild(“from”).equalTo(“ragesh”);
System.out.println(“聊天列表::启动”);
addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
System.out.println(“聊天列表::onchildaded”);
for(DataSnapshot聊天:DataSnapshot.getChildren()){
HashMap HashMap=(HashMap)dataSnapshot.getValue();
System.out.println(“聊天列表::聊天组为=>”+dataSnapshot.getKey());
System.out.println(“Chat list::The key&Value=>”+Chat.getKey()+“:”+Chat.getValue().toString());
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Toast.makeText(ChatListActivity.this,“连接错误”+databaseError.getDetails(),Toast.LENGTH\u SHORT.show();
System.out.println(“聊天列表::databaseError”+databaseError.toString());
}
});
遗憾的是,上面的代码没有返回任何值。即使是System.out.println(“聊天列表::onchildaded”)代码>未调用。而且
也不会取消调用(因此,没有错误)
我被这个吓坏了。请帮帮我 要获取用户名:
mRootRef.child("chats").child("teamrova").orderByChild("from").equalTo("ragesh").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String name=datas.child("from").getValue().toString();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
由于您使用的是addChildeventListener
,因此不需要for循环就可以为(DataSnapshot chat:DataSnapshot.getChildren())获取这些值{
您还需要更改以下内容:
reference1 = FirebaseDatabase.getInstance().getReference().child("chats");
为此:
reference1 = FirebaseDatabase.getInstance().getReference().child("chats").child("teamrova");
上述代码是另一种选择,可使用addValueEventListener
获取用户名:
mRootRef.child("chats").child("teamrova").orderByChild("from").equalTo("ragesh").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String name=datas.child("from").getValue().toString();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
由于您使用的是addChildeventListener
,因此不需要for循环就可以为(DataSnapshot chat:DataSnapshot.getChildren())获取这些值{
您还需要更改以下内容:
reference1 = FirebaseDatabase.getInstance().getReference().child("chats");
为此:
reference1 = FirebaseDatabase.getInstance().getReference().child("chats").child("teamrova");
上面的代码是addValueEventListener
的另一种选择,因为这里的用例是搜索,所以最好使用SingleValueEvent只获取一次数据,避免搜索结果中的更改。但是如果我不知道团队名称?@PeterHaddad,我想检索团队名称,所以我不能在程序中硬编码teamrova
am.@LordCommander好的,如果快照处于“聊天”状态,而您不知道团队名称,则需要迭代两次,但orderbychild(..)不起作用。因为orderbychild命令的是直接child@PeterHaddad…请给出代码好吗?。请..我是firebase的新手。因为这里的用例是搜索,所以最好使用SingleValueEvent只获取一次数据,避免搜索结果中的更改。但是如果我不知道团队名称?@PeterHaddad我想检索团队名称,因此无法在程序中硬编码teamrova
。@好的,如果快照在chats
上,而您不知道团队名称,则需要迭代两次,但orderbychild(..)不起作用。因为orderbychild命令的是直接child@PeterHaddad…请你给我这个的代码好吗?.请..我是firebase的新手。