【问题标题】:Sort Firebase Data with queryOrdered by date使用 queryOrdered by date 对 Firebase 数据进行排序
【发布时间】:2017-01-01 14:54:33
【问题描述】:

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

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

使用相同的 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()
})

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

我有一个ruby mentality,所以我很快就迷路了。谢谢。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    我认为你在这里缺少的是 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
    })
    

    【讨论】:

    • 上线let users,收到fatal error: unexpectedly found nil while unwrapping an Optional value
    • 在错误行之前尝试print(usersSnapshot),看看包含什么
    • 返回数据。
    • 我在 Playground 中加载你的 JSON 并使用上面相同的代码......它工作正常......奇怪。打印时数据是否包含“users”键?
    • 好的,如何将sorted 分配给我的班级:var incomes = [Income]()?我可以用self.incomes.append(income)
    【解决方案2】:

    我认为问题在于您正在观察 .value,它基本上忽略了 order by。尝试通过.childAdded观察,确实尊重操作顺序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 2017-02-14
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多