如何从嵌套父firebase获取user_id

时间:2017-07-19 05:04:31

标签: swift firebase firebase-realtime-database

我想基于user_id检索网站信息,我正在使用以下查询来检索网站信息

ref = Database.database().reference()

        self.ref.child("sites").queryOrdered(byChild: "user_id").queryEqual(toValue:"DxMYXkVqnZMC6NEZxdSQF3G2ZJ53")
            .observe(.childAdded, with: { snapshot in

                if ( snapshot.value is NSNull ) {
                    print("Not found")


                } else {
                    print("found")


                }
            })

我可以调用查询,如果它的store_name,idToken等。但是无法调用user_id,因为它位于childbuAutoid

enter image description here

3 个答案:

答案 0 :(得分:0)

您可以为"用户"创建新的值监听器。然后相应地处理每个孩子,或者你可以使用for循环来遍历孩子,如下所示:

for child in snapshot.childSnapshot(forPath: "users").children

答案 1 :(得分:0)

由于您的userID是嵌套的,因此您需要保持循环数据,这就是它看起来很难看的原因。看看下面的代码,它应该工作。它只是循环遍历值,直到找到user_id。有关图片的更多信息,请参阅我的其他答案:https://stackoverflow.com/a/45143371/7715250它可以更清楚地了解某些内容的用途。

ref = Database.database().reference()

        self.ref.child("sites").observe(.childAdded, with: { snapshot in

                if ( snapshot.value is NSNull ) {
                    print("Not found")


                } else {
                 print("found")
                 let enumerator = snapshot.children
                 while let rest = enumerator.nextObject() as? FIRDataSnapshot {
                   if (rest as? DataSnapshot).key == "users"{
                   let enumerator2 = (rest as? DataSnapshot).children
                     while let rest2 = enumerator2.nextObject() as? FIRDataSnapshot {
                   for userID in (rest2 as? DataSnapshot).children{
                     let values = (userID as? DataSnapshot).value as? NSDictionary
                     let userId = values?["user_id"] as? String ?? ""
                      print(userId)
            }
         }
     }
   }
 }
})

答案 2 :(得分:0)

如果您可以稍微更改数据库结构,则不必使用所有循环。 您可以更改您的数据库,如下图所示。 相反,使用自动生成的密钥,您可以将用户ID用作密钥,并将值放在任何您喜欢的位置。

enter image description here

现在你写这样的查询。(抱歉!!这段代码片段在java中,Don&#t; t 知道很快,但这会帮助你。)

dbr.child("sites").orderByChild("users/"+/*put user_id you want to search*/).equalTo("user_id").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

           /*here you get the datasnapshot according to search*/

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

尝试更新您的代码。

self.ref.child("sites").queryOrdered(byChild: "users/"+"DxMYXkVqnZMC6NEZxdSQF3G2ZJ53").queryEqual(toValue:"user_id")
        .observe(.childAdded, with: { snapshot in

            if ( snapshot.value is NSNull ) {
                print("Not found")


            } else {
                print("found")


            }
        })

希望这会对你有所帮助。