Firebase iOS .queryOrderedByChild和.queryEqualTo无效

时间:2016-12-20 15:44:06

标签: ios swift firebase firebase-realtime-database

我尝试使用类似此结构的Firebase数据库过滤结果。

chats
    chatId
        messages
            messageId
                userId: true

我需要两个查询,一个只返回包含现有子 userId 的消息(如果它存在则始终为true),另一个只返回没有它的消息。

我尝试使用这两个引用并观察.childAdded事件:

let messagesWithUser = FIRDatabase.database().reference(withPath: "chats").child(chat.id).child("messages").queryOrdered(byChild: userId).queryEqual(toValue: true).ref
let messagesWithoutUser = FIRDatabase.database().reference(withPath: "chats").child(chat.id).child("messages").queryOrdered(byChild: userId).queryEqual(toValue: NSNull()).ref

目前.childAdded事件返回所有消息而不进行过滤。

3 个答案:

答案 0 :(得分:3)

回应Dmitriy

func blueRewardBalance(completeBlock: (value: Double) -> Void) {
        let userRef = FIRAuth.auth()?.currentUser?.uid
        var rewardBalance : Double! = 0.00
        let purchaseRef = FIRDatabase.database().reference(withPath: "Reward/\(userRef!)")
        purchaseRef.queryOrdered(byChild: "abc").observe(.value, with: { snapshot in
            let dataSnapshot = snapshot.value as! [String: AnyObject]
            rewardBalance = dataSnapshot["rewardCardBalance"] as! Double!
            completeBlock(rewardBalance)
        })
}

答案 1 :(得分:0)

发现问题所在。我使用FIRDatabaseReference而不是FIRDatabaseQuery来观察变化......

答案 2 :(得分:0)

谢谢Nicola。我需要在我的函数中实现先前的方法,但是blueRewardBalance请求参数。

func blueRewardTransaction(purchaseValue: Double) {
        let newBalance = blueRewardBalance(completeBlock: //what I need paste here?) - purchaseValue
        let userRef = FIRAuth.auth()?.currentUser?.uid
        let firebaseRef = FIRDatabase.database().reference()
        firebaseRef.child("Reward/\(userRef!)").updateChildValues(["rewardCardBalance": newBalance])
    }