如何获得firebase中的密钥

时间:2017-01-13 14:52:11

标签: android firebase firebase-realtime-database

我想在特定密钥下检索消息数据。但我不知道如何获得钥匙。请帮忙,我是firebase的新手。

就我而言,我想把钥匙包围在下面。

我在下面尝试过这段代码,但这会返回“聊天伙伴”而不是密钥。

enter image description here

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) {

        }
    });

我在下面尝试过这段代码,但这会返回“聊天伙伴”而不是密钥。

2 个答案:

答案 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

通过这种方式,您可以在聊天中获得配偶/参与者,而无需访问(甚至无需访问)消息本身。