没有结果时,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
如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular