在Swift中使用Firebase实时数据库时如何获取Array数据?

时间:2018-02-07 13:10:49

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

当我从Firebase实时数据库获取数据时,我遇到了麻烦,所以我写了这个问题。

这就是我想做的事情。

这是保存在Firebase数据库中的数据。

{ "schedule": 
  {"day0" : [{"title":"wake up", "content":"Wake up at 7 AM"},
             {"title":"School","content":"Go to the school"}],
   "day1" : [{"title":"day1 wakeup", "content":"Wake up at 8 AM"},
             {"title":"Supermarket", "content" :"buy some food"}]
   }
} 

在这种情况下,我想在第0天获得所有时间表。

[{"title":"wake up", "content":"Wake up at 7 AM"},
{"title":"School","content":"Go to the school"}]

所以我制作了这样的代码。

var ref:DatabaseReference!
ref = Database.database().reference()

ref.child("schedule").child("day0").observeSingleEvent(of: .childAdded) { (snapshot) in
  var postData = [NSDictionary]()
  self.dataList = (snapshot.value as? NSDictionary)!
  print("\(self.dataList)")
  self.tableView.reloadData()
}

这就是结果。 :(

{"title":"wake up", "content":"Wake up at 7 AM"}

如何获取“day0”值的所有数据?

2 个答案:

答案 0 :(得分:0)

现在您正在观察单个.childAdded事件。这意味着您只能获得day0下的第一个子节点。

有两种方法让所有孩子:

  1. 观察所有.childAdded事件
  2. 观察.value事件
  3. 第一种方法最简单......

    ref.child("schedule").child("day0").observe(.childAdded) { (snapshot) in
      print("\((snapshot.value as? NSDictionary)!)")
      self.tableView.reloadData()
    }
    

    通过此最小更改,将为每个子节点调用完成处理程序。另请参阅此example in the documentation on listening for child events

    或者你可以观察.value(连续一次),一次调用所有匹配的数据。这意味着您的代码需要处理它一次获取所有数据的事实:

    ref.child("schedule").child("day0").observe(.value) { (snapshot) in
      var postData = [NSDictionary]()
      self.dataList = (snapshot.value as? NSDictionary)!
      print("\(self.dataList)")
      self.tableView.reloadData()
    }
    

    另见example in the documentation to listening for value events

答案 1 :(得分:0)

var dataList: [Dictionary<String,Any>]?

ref.child("schedule").child("Day0").observeSingleEvent(of: .value) { (snapshot) in

self.dataList = snapshot.value as! [Dictionary]
self.tableView.reloadData()
}

这是我最终成功的结果!谢谢你的帮助!