Android 如何在firebase中获取密钥

Android 如何在firebase中获取密钥,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想检索特定键下的消息数据。但我不知道怎么拿到钥匙。请帮忙,我是firebase的新手 就我现在的情况而言,我想把钥匙圈在下面 我试过下面的代码,但返回的是“聊天伙伴”,而不是键 我在下面尝试了这段代码,但它返回的是“chat mates”,而不是键。您必须使用DataSnapshot方法访问JSON树。 DataSnapshot元素有一个名为getKey()的方法。返回对象的键 官方文件: 示例代码: 在您的情况下,首先访问子节点“conversation”,然后应用上述方法getKey()

我想检索特定键下的消息数据。但我不知道怎么拿到钥匙。请帮忙,我是firebase的新手

就我现在的情况而言,我想把钥匙圈在下面

我试过下面的代码,但返回的是“聊天伙伴”,而不是键


我在下面尝试了这段代码,但它返回的是“chat mates”,而不是键。

您必须使用
DataSnapshot
方法访问JSON树。
DataSnapshot
元素有一个名为
getKey()
的方法。返回对象的键

官方文件:

示例代码:


在您的情况下,首先访问子节点“conversation”,然后应用上述方法
getKey()

您必须使用
DataSnapshot
方法访问JSON树。
DataSnapshot
元素有一个名为
getKey()
的方法。返回对象的键

官方文件:

示例代码:


在您的情况下,首先进入子节点“对话”,然后应用上面的方法
getKey()

您构建的路径错误,并且很可能最终迭代树的不同部分,比
子节点高一级。在这种情况下,
child mates
是一个子键是正确的

问题出在创建ref时的最后一个
child()
调用中:

final DatabaseReference ref =FirebaseDatabase.getInstance().getReference()
    .child("chat")
    .child("single-chat")
    .child("converstation")
    .child("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() {
这将过滤每个聊天的
聊天伙伴/receiverName
子项

请注意,使用此数据结构与Firebase的一项建议背道而驰。Firebase建议不要像这里那样嵌套数据类型

更非规范化的数据模型是:

chat-mates
  $chatRoomId
    receiverName
    senderName
chat-messages
  $chatRoomId
    $messageId

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

您构建的路径错误,很可能最终会迭代树的不同部分,比子伙伴高一级。在这种情况下,
child mates
是一个子键是正确的

问题出在创建ref时的最后一个
child()
调用中:

final DatabaseReference ref =FirebaseDatabase.getInstance().getReference()
    .child("chat")
    .child("single-chat")
    .child("converstation")
    .child("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() {
这将过滤每个聊天的
聊天伙伴/receiverName
子项

请注意,使用此数据结构与Firebase的一项建议背道而驰。Firebase建议不要像这里那样嵌套数据类型

更非规范化的数据模型是:

chat-mates
  $chatRoomId
    receiverName
    senderName
chat-messages
  $chatRoomId
    $messageId

通过这种方式,您可以让同伴/参与者参与聊天,而无需访问(甚至无需访问)消息本身。

我尝试过使用DataShapshot,但我不知道如何根据json树实现逻辑。顺便说一下,我已经编辑了上面的问题@aseedusmanit然后转到父节点,然后使用
getKey()
方法,因为chat mates实际上是您所在的DataSnapshot的键。您可以使用getRef().getKey()实现此目的。不幸的是,目前我的系统上没有Firebase应用程序设置,因此您必须亲自测试@Elbertrivast谢谢您的回复。这里我真正的问题是我的json结构。我按照弗兰克的建议修改了它,然后我就可以轻松地检索数据了@Aseedusmani已经尝试过使用DataShapshot,但我不知道如何实现基于json树的逻辑。顺便说一下,我已经编辑了上面的问题@aseedusmanit然后转到父节点,然后使用
getKey()
方法,因为chat mates实际上是您所在的DataSnapshot的键。您可以使用getRef().getKey()实现此目的。不幸的是,目前我的系统上没有Firebase应用程序设置,因此您必须亲自测试@Elbertrivast谢谢您的回复。这里我真正的问题是我的json结构。我按照弗兰克的建议修改了它,然后我就可以轻松地检索数据了@这解决了我的问题。我意识到我的json结构是多么复杂。非常感谢你@弗兰克·范·帕弗伦斯解决了我的问题。我意识到我的json结构是多么复杂。非常感谢你@弗兰克·范·帕夫伦