我正在使用Firebase,我想查询是否存在某些内容.找到值时会调用它,但在找不到任何内容时不会调用该块.这是预期的行为吗?
ref.queryOrderedByKey().queryEqualToValue(channelName).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in print("found channel: \(snapshot.key)") }, withCancelBlock: { error in print(error.description) })
我做错了什么吗?谢谢
要检查没有数据(snapshot == 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") } })