【问题标题】:What to do when snapshot.exists() returns false?当 snapshot.exists() 返回 false 时怎么办?
【发布时间】:2017-08-11 01:48:06
【问题描述】:

我有一个存在的 ref,我使用 observeEventType 来查询数据。但是由于用户删除了 ref,因此 ref 中可能没有数据。我使用snapshot.exists() 对其进行测试。在以下情况下snapshot.exists() 将返回false/no。由于它是错误的,我想做其他事情,但代码永远不会运行

当 snapshot.exists() 返回 false/no 时,我该怎么做?

     //there is no data at levelTwo so there's nothing to observe
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo")

levelTwoRef.observeEventType(.ChildAdded, withBlock: {
        (snapshot) in
        if snapshot.exists(){
           if let dict = snapshot.value as? [String:AnyObject]{
              let power = dict["power"] as? String
              let score = dict["score"] as? String
           }
        //this will never run because the data has been deleted
        } else{
          do something else as an alternative //why isn't this running??
        }
    })

【问题讨论】:

  • 用您的数据库 JSON 结构更新您的问题(实际,作为文本而不是图像!)。
  • 这不是您的 JSON 结构,您可以通过单击 Firebase 数据库控制台中的 EXPORT JSON 来获取您的 JSON 结构,将其最小化到最相关的部分,然后发布它。
  • @Dravidian 你教会了我一些新东西。我从来不知道。我会在几秒钟内完成。谢谢!
  • @Dravidian 这是我回来的:{“错误”:“身份验证令牌已过期”}

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

Firebase 有一个 .hasChild 函数,您可以在 child 上运行它以查看它是否存在:

func hasChild(_ childPathString: String) -> Bool

它将child 作为String 参数并返回TrueFalse,具体取决于它是否存在。

检查一个孩子是否存在的方法是在你寻找的孩子之前先设置一个孩子的路径。在问题的情况下,要查找的孩子是"levelTwo",之前的孩子是uid

 //there is no data at levelTwo so there's nothing to observe
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo")

假设您知道 uid ref 肯定存在,请为 uid ref 设置一个常量,而不是 levelTwo ref

// uid path definitely exists
let uidRef = dbRef.child("players").child("uid")

uid ref 上运行 .value 并在回调内部检查 levelTwo ref 是否存在:

uidRef?.observeSingleEvent(of: .value, with: {
                (snapshot) in

                if snapshot.hasChild("levelTwo"){
                     // true -levelTwo ref Does exist so do something
                }else{
                    // false -levelTwo ref DOESN'T exist so do something else
                }
}

【讨论】:

    【解决方案2】:

    您正在使用类型.ChildAdded 在observeEventType 中运行它,这将返回创建的每个新路径的快照。如果您只需要检索一次值,则应使用observeSingleEventOfType (link),并以.Value 作为事件类型。

    【讨论】:

    • 谢谢。 2件事。 1-我尝试了observeSingleEventOfType,因为那里什么都没有,所以我的else语句没有运行。 2-节点下将有多个路径。 .Value 一次从节点获取所有内容的快照。 .ChildAdded 进行多次旅行以获取节点下的所有内容。无论哪种情况,您都会得到相同的结果。那不是我的问题。我的问题是什么都没有时该怎么办。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2022-08-17
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多