如何从firebase中的值获取密钥

THe*_*rOX 10 android firebase firebase-realtime-database

当我知道Firebase中的以下结构中的"name"字段包含"efg"时,如何获取密钥"-KLpcURDV68BcbAvlPFy".

clubs
    -KLpcURDV68BcbAvlPFy
        dept: "abc"
        desc: "xyz"
        name: "efg"
    -asdasdasddsad
        dept: "asda"
        desc: "asd"
        name: "adddd"
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但它返回了"俱乐部"

mDatabase.child("clubs").orderByChild("name").equalTo("efg").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String clubkey =dataSnapshot.getKey();
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 17

那是因为你正在使用ValueEventListener.如果查询匹配多个子节点,则返回所有这些子节点的列表.即使只有一个匹配的孩子,它仍然是一个列表.而且,由于您正在调用getKey()该列表,因此您将获得运行查询的位置的键.

要获取匹配子项的键,请遍历快照的子项:

mDatabase.child("clubs")
         .orderByChild("name")
         .equalTo("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            String clubkey = childSnapshot.getKey();
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您认为俱乐部名称是唯一的,您可以将俱乐部存储在他们的名下,并在没有查询的情况下访问正确的俱乐部:

mDatabase.child("clubs")
         .child("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String clubkey = dataSnapshot.getKey(); // will be efg
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 5

如果有人需要使用 Kotlin 执行此操作:

mDatabase.child("clubs")
        .orderByChild("name")
        .equalTo("efg")
        .addListenerForSingleValueEvent(object: ValueEventListener {

            override fun onDataChange(dataSnapshot: DataSnapshot) {

                dataSnapshot.children.forEach {
                     //"it" is the snapshot
                     val key: String = it.key.toString()
                }
            }

            override fun onCancelled(p0: DatabaseError) {
                    //do whatever you need
            }
         })
Run Code Online (Sandbox Code Playgroud)