一尘不染

Firebase queryOrderedByChild()方法未提供排序数据

swift

我的数据库结构是这样的:

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "score": 4,
    },
    "ghopper": { ... },
    "eclarke": { ... }
  }
}

我试图按降序检索前20个得分。

let queryRef = FIRDatabase.database().reference().child("users").queryOrderedByChild("score").queryLimitedToLast(20)
queryRef.observeSingleEventOfType(.Value, withBlock: { (querySnapShot) in
      print(querySnapShot.value)
})

我试图获得输出像

score": 4
score": 3
score": 2

or

score": 2
score": 3
score": 4

or

2
3
4

请让我知道如何解决这个问题。


阅读 250

收藏
2020-07-07

共1个答案

一尘不染

使用方法observeEventType代替observeSingleEventOfType。另外,将FIRDataEventType设置为ChildAdded

最后,如果要使用前20个项目,请使用queryLimitedToFirst代替queryLimitedToLast

{
  "users" : {
    "alovelace" : {
      "name" : "Ada Lovelace",
      "score" : 4
    },
    "eclarke" : {
      "name" : "Emily Clarke",
      "score" : 5
    },
    "ghopper" : {
      "name" : "Grace Hopper",
      "score" : 2
    }
  }
}

对于上面的数据集

let queryRef = FIRDatabase.database().reference().child("users").queryOrderedByChild("score").queryLimitedToFirst(20)
queryRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
    print("key: \(snapshot.key), value: \(snapshot.value)")
})

键:引子,值:可选({name = Grace Hopper; score = 2;})

键:alovelace,值:可选({name = Ada Lovelace; score = 4;})

键:eclarke,值:可选({name = Emily Clarke; score = 5;})

快照将以本机类型返回内容。返回的数据类型:

  • NSDictionary
  • NSArray
  • NSNumber(还包括布尔值)
  • NSString

因此,您可以通过这种方式获得分数。

    let queryRef = FIRDatabase.database().reference().child("users").queryOrderedByChild("score").queryLimitedToFirst(20)
queryRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
    if let scores = snapshot.value as? NSDictionary {
        print(scores["score"])
    }
})

可选的(2)

可选的(4)

可选的(5)

此外,实时数据库的默认值以 升序 返回所有内容。

如果要 降序排列 ,可以在数据库中进行一些
技巧 (4:40)。

2020-07-07