【问题标题】:How to get user_id from nested parent firebase如何从嵌套的父 firebase 获取 user_id
【发布时间】:2017-12-24 04:23:51
【问题描述】:

我想根据 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 内

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果您可以稍微更改您的数据库结构,那么您就不必使用所有循环。 您可以更改您的数据库,如下图所示。 而不是使用自动生成的密钥,您可以使用用户 ID 作为密钥并根据您的喜好设置值。

      现在你这样写你的查询。(对不起!!这段代码 sn-p 是在 java 中,不要 知道迅速,但这会帮助你)。

      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")
      
      
                  }
              })
      

      希望这会对你有所帮助。

      【讨论】:

      • 如果我们编辑当前的数据库结构将很难处理,是否可以使用当前结构
      • 是的,但是您需要使用编码来完成,获取数据快照中的值,然后检查 user_id 是否存在。
      【解决方案3】:

      由于您的用户 ID 是嵌套的,因此您需要不断循环数据,这就是它看起来难看的原因。看看下面的代码,它应该可以工作。它只是不断循环遍历这些值,直到找到 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)
                  }
               }
           }
         }
       }
      })
      

      【讨论】:

      • 其实它没有进入“未找到”或“找到”
      • @HaseenaPA 我对 ref 做了一个小改动,奇怪的是它没有打印任何东西。你有完整的权限吗?
      • @HaseenaPA 您可以查看我在答案中提供的链接,它让您了解如何遍历多个数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多