在Swift 3中从Firebase查询和排序数据

时间:2017-03-01 03:14:20

标签: ios swift sorting firebase firebase-realtime-database

我知道之前已经问过这个问题的衍生物,但对iOS开发不熟悉我通过拼凑一些信息来获得我想要的结果有点不成功。希望有人能够帮助我。

我的目标:
查询firebase数据库中的名称(字符串)和分钟(int)信息。根据总分钟的降序显示表视图中的名称和总分钟数(用于名称)。

数据库结构:
Firebase Screenshot

我尝试了什么:
我可以从firebase中提取分钟的整数数组,但我不知道如何将值重新附加到名称和日期信息。我也尝试查询[Name:Minutes]字典,因为名称附加了几分钟整数,所以它不起作用。我也尝试使用所有相关变量创建一个类,但由于类型不同,我在创建包含所有信息的数组时遇到问题。

我的问题:
理想情况下,我会有一个childByAutoID()的字典,其上附有所有信息,但我不知道这是可能的。查询数据库然后使用查询信息以显示名称列表和与该名称关联的分钟总值的最佳方法是什么?

我的代码:
从文本字段中投射变量

extension ViewController: UITextFieldDelegate {

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if !textField.text!.isEmpty {
            let dat = textField.text!
        let dat2 = Int(dat)
        let data = [Constants.MinuteFields.minutes: dat]

        if dat2 != nil {

            sendMessage(data: data)

        } else {
            let alertController = UIAlertController(title: "Validation Error", message: "You must enter an integer number!", preferredStyle: .alert)
            let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.destructive, handler: {(alert : UIAlertAction!) in
                alertController.dismiss(animated: true, completion: nil)
            })
            alertController.addAction(alertAction)
            present(alertController, animated: true, completion: nil)
            print("not an integer")
        }
        textField.resignFirstResponder()
    }
    return true
}

}

将代码发送到Firebase

    func sendMessage(data: [String:String]) {

        var mdata = data
        mdata[Constants.MinuteFields.name] = displayName
        mdata[Constants.MinuteFields.uid] = emailAddress
        var test = NSDate().timeIntervalSince1970
        self.timestamp = "\(test

)"
        mdata[Constants.MinuteFields.timestamp] = self.timestamp
        ref.child("minutes").childByAutoId().setValue(mdata)
        performSegue(withIdentifier: "toList", sender: nil)

    }

在tableview中显示变量

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // dequeue cell
    let cell: UITableViewCell! = messagesTable.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath)
    // unpack message from firebase data snapshot

    let messageSnapshot = minutes[indexPath.row]
    let message = messageSnapshot.value as! [String: String]

    let name = message[Constants.MinuteFields.name] ?? "[name]"
    let text = message[Constants.MinuteFields.minutes] ?? "[minutes]"


    cell!.textLabel?.text = name + ": " + text

    return cell!     
}

0 个答案:

没有答案