从 Firebase 中基本读取并使用结果加载 tableview (Swift)

Posted

技术标签:

【中文标题】从 Firebase 中基本读取并使用结果加载 tableview (Swift)【英文标题】:Basic Read from Firebase and load tableview with results (Swift) 【发布时间】:2018-06-07 17:50:33 【问题描述】:

我试图简单地读取我的 firebase 数据并用这些信息填充一个 tableview。出于某种原因,我似乎只能让第一个项目出现。我的 Firebase 数据如下所示:


"Filter by Color" : 
   "New Black" : 
      "Astrophyllite" : 
         "color" : "Black",
         "name" : "Astrophyllite",
         "properties" : "Astral Travel, Physic Protection"
      ,
      "Onyx" : 
         "Properties" : "The Heals",
         "color" : "Black",
         "name" : "Onyx"
      
   
 

我的 firebase 权限设置为读取:true,写入:false(我想要公共读取权限,但应用程序没有数据库更改。

我的 Swift 代码:

override func viewDidLoad() 
    ref.child("Filter by Color").child("New Black").observe(DataEventType.value, with:  (snapshot) in
        var crystalList: [CrystalDefinitionClass] = []
        for child in snapshot.children 
            if let snapshot = child as? DataSnapshot,
                let crystals = CrystalDefinitionClass(snapshot: snapshot) 
                self.crystalArray.append(crystals)


            
        

        //            self.crystalArray = crystalList
        self.tableView.reloadData()
    )


以下是我的表格视图的信息:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int // #warning Incomplete implementation, return the number of rows // return self.Crystal.count print(crystalArray.count) return crystalArray.count

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let crystalDB = crystalArray[indexPath.row]

    cell.textLabel?.text = crystalDB.name

    return cell

这会导致来自数据库的单个结果。在这里的任何帮助将不胜感激!

【问题讨论】:

请在文本中包含您实际 Firebase 结构的格式化 sn-p。您可以从 Firebase 控制台->导出 JSON。 哦,你的代码和你的结构不匹配;您的结构是 /Filter by Color/Black 并且您的代码正在寻找 /Filter by Color/New Black。而且,您正在重复使用变量名称 snapshot - 将闭包内的快照命名为 childSnap 之类的名称而不是相同的名称是合适的。 我的 json 数据:“按颜色过滤”:“黑色”:“Astrophyllite”:“颜色”:“黑色”,“名称”:“Astrophyllite”,“属性”: "Astral Travel, Psychic Protection" , "Black Quartz" : "Color" : "Black", "Crystal" : "Black Quartz", "Name" : "Black Quartz" , “New Black”是对一些 json 数据进行重构的尝试(我在想也许我做错了什么。现在快照重用是我没有抓住的东西。我想调查一下。我在网上做了很多研究,并试图找到不同的方法来完成这项任务,所以我可能已经重叠了一些。奇怪的是,第一个项目出现在 tableview 中,但就是这样。我尝试将其移动到视图会出现,然后在视图中运行辅助 reload() 确实加载(认为它可能只是加载一个)但没有去 问题是您的第一个节点有 properties,而第二个节点有 Properties。 Firebase 对这些键区分大小写,因此它们需要保持一致。 【参考方案1】:

Firebase 具有区分大小写的键,因此在这种情况下,在 New Black 节点中,第一个子节点具有“属性”

  "Astrophyllite" : 
     "color" : "Black",
     "name" : "Astrophyllite",
     "properties" : "Astral Travel, Physic Protection"
  ,

第二个子节点有“属性”

  "Onyx" : 
     "Properties" : "The Heals",
     "color" : "Black",
     "name" : "Onyx"
  

Firebase 会考虑这两个不同的键。通常,子节点键在子节点之间保持一致至关重要,这样才能正确读取和查询它们。

【讨论】:

以上是关于从 Firebase 中基本读取并使用结果加载 tableview (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 读取数据并保存到数组中 (Swift)

从 Firebase 读取数据并将其保存到数组中 - React

如何从 Firebase 存储中的文件夹加载图像并在其他地方使用它

无法使用 Flutter Image Network 从 Firebase 存储加载图像

从 Firebase 读取/检索数据

从 Firebase 完成加载后如何使 UIRefreshControl 结束刷新