我想在特定密钥下检索消息数据。但我不知道如何获得钥匙。请帮忙,我是firebase的新手。
就我而言,我想把钥匙包围在下面。
我在下面尝试过这段代码,但这会返回“聊天伙伴”而不是密钥。
final DatabaseReference ref =FirebaseDatabase.getInstance().getReference().child("chat").child("single-chat").child("converstation").child("chat-mates");
ref.orderByChild("receiverName").equalTo("Liza Soberano").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()){
String key = child.getKey();
Log.e("Key", key);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我在下面尝试过这段代码,但这会返回“聊天伙伴”而不是密钥。
答案 0 :(得分:5)
您必须使用DataSnapshot
方法来访问JSON树。
DataSnapshot
元素有一个名为getKey()
的方法。返回对象的键。
官方文件:DataSnapShot getKey() method
示例代码:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot objSnapshot: snapshot.getChildren()) {
Object obj = objSnapshot.getKey();
}
}
@Override
public void onCancelled(DatabaseError firebaseError) {
Log.e("Read failed", firebaseError.getMessage());
}
});
在您的情况下,首先进入子节点"会话"然后应用上述方法getKey()
。
答案 1 :(得分:1)
您正在构建错误的路径,最终可能会迭代树的不同部分,比child-mates
高一级。在这种情况下,child-mates
是子键是正确的。
问题发生在创建ref:
时的最后一次child()
调用中
final DatabaseReference ref =FirebaseDatabase.getInstance().getReference()
.child("chat")
.child("single-chat")
.child("converstation")
.child("chat-mates");
chat-mates
下没有子converstation
,所以此引用不正确。
你可能想这样做:
final DatabaseReference ref =FirebaseDatabase.getInstance().getReference()
.child("chat")
.child("single-chat")
.child("converstation");
ref.orderByChild("chat-mates/receiverName")
.equalTo("Liza Soberano")
.addListenerForSingleValueEvent(new ValueEventListener() {
这会过滤每次聊天的chat-mates/receiverName
孩子。
请注意,您使用此数据结构时违反了Firebase的一项建议。 Firebase建议您不要像在此处那样嵌套数据类型。
更加非规范化的数据模型将是:
chat-mates
$chatRoomId
receiverName
senderName
chat-messages
$chatRoomId
$messageId
通过这种方式,您可以在聊天中获得配偶/参与者,而无需访问(甚至无需访问)消息本身。