使用queryOrdered按日期对Firebase数据进行排序

时间:2017-01-01 14:54:33

标签: ios swift firebase firebase-realtime-database

我需要按日期(unix)排列我的firebase数据。我以为queryOrdered(byChild: "date")会做到这一点。完成search并找到this,这是有道理的:

  

但是当您请求快照的.value时,键+数据将转换为Dictionary。由于字典没有额外的位置来放置有关订单的信息,因此在转换为字典时该信息会丢失。

使用相同的json但使用unix日期进行修改...:

{
  "users" : {
    "alovelace" : {
      "name" : "Last Year",
      "date" : 1480550400
    },
    "eclarke" : {
      "name" : "New Year Now",
      "date" : 1483228800
    },
    "ghopper" : {
      "name" : "New Year",
      "date" : 1483228800
    }
  }
}

...当我的代码是这样的时候如何排序:

DataService.ds.REF_INCOMES.queryOrdered(byChild: "date").observe(.value, with: { (snapshot) in

    if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
        print(snapshot)
        for snap in snapshot {
            if let incomeDict = snap.value as? [String: AnyObject] { // What needs to change here?
                let key = snap.key
                let income = Income(incomeId: key, incomeData: incomeDict)
                self.incomes.append(income)
                self.incomes.reverse()
            }
        }
    }
    self.tableView.reloadData()
})

下面的图片,“去年”应该是最后一个,但不是:

enter image description here

我有ruby mentality所以我很快失去了。感谢。

2 个答案:

答案 0 :(得分:0)

我认为您在这里缺少的是sort功能,请尝试以下代码并告诉我结果如何:

DataService.ds.REF_INCOMES.queryOrdered(byChild: "date").observe(.value, with: { (snapshot) in

    guard let usersSnapshot = snapshot.value as? [String:NSObject] else{

        return
    }

    let users = usersSnapshot["users"] as! [String:AnyObject]
    let sorted = users.sorted{($0.0.value["date"] as! Double) > ($0.1.value["date"] as! Double)}


    print(sorted) // It should be: New Year Now, New Year, Last Year
})

答案 1 :(得分:0)

我认为问题在于你正在观察.value,这基本上忽略了顺序。尝试按.childAdded观察,它通过操作尊重订单。

欲了解更多信息,请阅读第一个"专业提示":https://howtofirebase.com/collection-queries-with-firebase-b95a0193745d