Firebase计数儿童

时间:2017-02-09 19:40:20

标签: ios objective-c firebase firebase-realtime-database

Firebase数据:

{
    "data": {
        "entry-1": {
            "created": 1484634400,
            "status": 1
        },
        "entry-2": {
            "created": 1482612312,
            "status": 0
        },
        "entry-3": {
            "created": 1481623400,
            "status": 1
        },
        "entry-4": {
            "created": 1485613233,
            "status": 1
        },
        "entry-5": {
            "created": 1489513532,
            "status": 0
        },
        "entry-6": {
            "created": 1483123532,
            "status": 1
        },
        "entry-7": {
            "created": 1481282376,
            "status": 1
        },
        "entry-8": {
            "created": 1432321336,
            "status": 1
        },
        "entry-9": {
            "created": 1464282376,
            "status": 0
        }
    }
}

我试图计算在status之前创建了多少活动条目(entry-4 = 1),并保持计数更新。

今天我收听数据库中的每一个变化,但它消耗了大量不必要的数据。有更好的方法吗?

代码:

FIRDatabaseQuery *query = [self.firebase child:@"data"];
[query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
    int count = 0;
    for (FIRDataSnapshot *child in snapshot.children) {
        if (child.value[@"status"] == 1 && child.value[@"created"] < 1485613233) {
             count++;
        }
    }
}];

1 个答案:

答案 0 :(得分:0)

我提供了一个Swifty答案,但它很容易转换为Obj-C

将您的数据结构更改为此

dynamicButton.Click += new EventHandler(...);

然后查询以检索4之前的所有条目,状态为1

{
    "data": {
        "-Yuna99s993m": {
            "created": 1484634400,
            "status": "1"
            "entry": "1"
            "status_entry": "1_1"
        },
        "-YUjns0909ks": {
            "created": 1482612312,
            "status": "0"
            "entry": "2"
            "status_entry": "0_2"
        },
        "-Y8hj98nmswm": {
            "created": 1481623400,
            "status": "1"
            "entry": "3"
            "status_entry": "1_3"
        },
        "-Y78903kjmsk": {
            "created": 1485613233,
            "status": "1"
            "entry": "4"
            "status_entry": "1_4"
        },
        "-YJuikw9klkos": {
            "created": 1489513532,
            "status": 0
            "entry": "5"
            "status_entry": "0_5"
        },

运行时,返回

let dataRef = ref.child("data")
let queryRef1 = dataRef.queryOrdered(byChild: "status_entry")
let queryRef2 = queryRef1.queryStarting(atValue: "1_1")
                         .queryEnding(atValue: "1_3")
queryRef2.observeSingleEvent(of: .value, with: { snapshot in
   print(snapshot.childrenCount) 
 })

这意味着在条目4之前有两个状态为1的节点;那些节点是

2

*节点名称如&#34; -Yuna99s993m&#34;使用childByAutoId创建 - 通常是将节点键名与它们包含的子数据解除关联的最佳做法。

这里的思考过程是通过将两个变量entry#和status组合成一个变量status_entry,我们限制startingAt和endingAt返回的内容。因此1_x将消除所有0_状态,并通过指定从x_1到x_3的条目进一步限制返回的节点。

诀窍是让节点在x_4之前正确,因为那将是.endingAt。如果它总是x_3那么它很容易。