没有结果时,Firebase 查询不调用块

Posted

技术标签:

【中文标题】没有结果时,Firebase 查询不调用块【英文标题】:Firebase queries not calling block when there are no results 【发布时间】:2016-01-03 14:39:34 【问题描述】:

我正在使用 Firebase,我想查询是否存在某些内容。当找到一个值时它会被调用,但当什么都没有找到时不会调用该块。这是预期的行为吗?

    ref.queryOrderedByKey().queryEqualToValue(channelName).observeSingleEventOfType(.ChildAdded, withBlock:  snapshot in
        print("found channel:  \(snapshot.key)")
        , withCancelBlock:  error in
        print(error.description)
    )

我做错了吗?谢谢

【问题讨论】:

嘿,您是否摆脱了查询并简单地使用了观察和检查快照.exists()?不过,下面的答案不使用查询。 【参考方案1】:

要检查没有数据(快照 == NULL),这样做是这样的

    let refToCheck = myRootRef.childByAppendingPath(channelNameString)
    refToCheck.observeEventType(.Value, withBlock:  snapshot in
        if snapshot.value is NSNull 
            print("snapshot was NULL")
         else 
            print(snapshot)
        
    )

与 .observeEventType 相比,查询非常繁重,而且由于您已经知道要检查的特定路径,因此它的性能会更好。

编辑:你也可以使用

if snapshot.exists()  ... 

当您想要检索包含特定值或值范围的子节点时,最好使用 Firebase 查询。

为 Firebase 3.x 和 Swift 3.x 编辑

    let refToCheck = myRootRef.child(channelNameString)
    refToCheck.observe(.value, with:  snapshot in
        if snapshot.exists() 
            print("found the node")
         else 
            print("node doesn't exist")
        
    )

注 1) 逻辑有所改变,因为我们现在利用 .exists 来测试快照是否存在。 注 2)这段代码让观察者在 Firebase 中处于活动状态,因此如果稍后创建节点,它将触发。

如果您想检查一个节点并且不想让观察者监视该节点,请执行以下操作:

    let refToCheck = myRootRef.child(channelNameString)
    refToCheck.observeSingleEvent(of: .value, with:  snapshot in
        if snapshot.exists() 
            print("found the node")
         else 
            print("node doesn't exist")
        
    )

【讨论】:

不适合我。在数据库中不存在 channelNameString 子项的情况下 @kanishka 我刚刚用上面的确切代码编写了一个快速测试,复制并粘贴到我的项目中。我让 channelNameString = "no_node" (不存在)并运行代码。输出为“快照为 NULL”。所以代码有效。问题必须在别处。也许你的代码中的一个新问题和你的 Firebase 结构的 sn-p 会揭示这个问题。 是的。这是数据库的权限问题。谢谢 @kanishka 您更改的权限是什么?当路径不存在时,我无法触发回调。 如果您使用 .value 事件,这将起作用。如果您保留. childAdded 会怎样?永远不会触发完成。

以上是关于没有结果时,Firebase 查询不调用块的主要内容,如果未能解决你的问题,请参考以下文章

如果超时或无法访问服务器,Fire base 不会调用 onCancelled

如何在一个块中获取 Firebase 查询的所有结果

何时在 Firebase 上启用离线功能调用完成块?

如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular

为啥这个 NSString 在 FireBase 查询块中为空?

如何在 Fire Base 中使用完成处理程序