如何在swift中显示嵌套firebase节点的数据?

时间:2017-01-07 17:55:35

标签: ios swift firebase firebase-realtime-database

以下是我在firebase中的数据库设计

- Sports
  - MainCategory (hypothetical category name)
    - SubCategory1
      - K_tgbBt6Vx0-kkg7e63
        - name:football
      - K_tgbBt6Vx0-kkg7a99
        - name:golf
     - Subcategory2
      - K_tgbBt6Vx0-kkgad21
        - name:Snooker
      - K_tgbBt6Vx0-kkg7e00
        - name:Table Tennis
  - MainCategory2
     - SomeOtherSubCategory1
      -K_tgbBt6Vx0-kkg7e00

我的目标:获取体育节点下的所有体育项目并在uicollectionview中按类别(即MainCategory和Sub类别)显示它们,并允许用户选择他所选择的体育项目。

EG。显示

主要类别1

子类别1

足球,高尔夫

SubCategory2

乒乓球,斯诺克

主要类别2

SomeOtherSubCategory1

曲棍球,网球

以下方法只让我在节点中更深一层

rootref.child("sports").observe(.value, with: { (snapshot) in

    let mainCategory = snapshot.key    
    for child in snapshot.children{
        print(child)
    }})



    rootref.child("sports").observe(.childAdded, with: { (snapshot) in


        let mainCategory = snapshot.key
        let mySnapshot = snapshot.value! as! NSDictionary


    }) { (error) in
        print(error.localizedDescription)
    }

此外,如果我有其他方式可以构建我的数据库,请告诉我

4 个答案:

答案 0 :(得分:1)

`rootref.child("sports").observe(.value, with: { (snapshot) in
    //This gets your mainCategory names
    let mainCategory = snapshot.key    
    for child in snapshot.children{
        print(child)
    }})



    rootref.child("sports").observe(.childAdded, with: { (snapshot) in


        let mainCategory = snapshot.key
        let mySnapshot = snapshot.value! as! NSDictionary


    }) { (error) in
        print(error.localizedDescription)
    }

//Now what you need to do is another snapshot to get the sub categories. It would be something like this:

rootref.child("sports").child("Sub-Category").observe(.value, with: { (snaps) in
   //Same steps as you did above
})

`

答案 1 :(得分:1)

很高兴知道像你一样拥有2.5k代表的男人正在问这样一个问题。我假设您了解MVC,当然将来,您需要一个可重用的服务类来处理Firebase请求,而模型类来处理数据。

接下来,您应该了解在Firebase上观察数据的不同方法。 单一事件类型事件。阅读文档:https://firebase.google.com/docs/database/ios/read-and-write

在构建数据库时,Firebase也有一个文档:https://firebase.google.com/docs/database/web/structure-data

无论如何,我为你做了一个样品,看看: http://www.jsoneditoronline.org/?id=5d9e7067883a538746ace7cdd9e81ebb

我使用 jsoneditoronline 网站创建了一个新结构,我相信这是一个更好的数据库结构。尽可能避免使用这么多嵌套节点。查看我的示例,我创建了必要的新节点,以便更快,更轻松地获取数据。例如,如果您要查看上面的链接并下载数据库并将其上传到Firebase数据库,您将看到如下结构:

enter image description here

正如您所看到的,我在这里有一个名为 subcategories-sportId 的父节点,它具有不同子类别的子节点以及每个子类别,我们有运动的ids。

另一个例子,如果我们想要获得子类别2下的所有体育项目,我们将不会使用 sport 节点内的数据。 (见下图)但相反,我们将检查 subcategories-sportid 节点内的数据。获取对该节点的引用,并添加特定子类别字符串的子节点,然后获取所有 sportsIds 。枚举 sportsIDs ,最后获取每项运动的主要数据。

enter image description here

但是如果我们想获得特定运动的所有子类别和主要类别,我们可以使用运动节点内的数据(见上图)

答案 2 :(得分:1)

  let cat3 = db.child("API Questions").child("Category3").child("Name")
    cat3.observe(FIRDataEventType.value, with:
        { (snapshot) in
            let eventDataloc = snapshot.value as? [String: AnyObject] ?? [:]

           // self.Cat3Qarray.removeAllObjects()

            for (_, value) in eventDataloc
            {
                let studsmodel = FirebaseStructureCustVM.updateQuestionData(Questiondata: value as![String:Any])
                self.Cat3Qarray.add(studsmodel)
                //print(studsmodel)
            }

            self.tableview1.reloadData()


//print snapshot here

    })

答案 3 :(得分:1)

enter image description here 在下面,如果我们想获得MaxMarks的“Category1”数据,“API问题”是“根”,“Category1”是该根的“子”:“20”,Q:“一般信息“,Qid:”问题1“所以你可以像这样打印快照=== print(”cat1 =(快照)的快照“)===你将获得Category1内的所有数据

        let cat2 = db.child("API Questions").child("Category1")
    cat2.observe(FIRDataEventType.value, with:
        { (snapshot) in
            let eventDataloc = snapshot.value as? [String: AnyObject] ?? [:]



            for (_, value) in eventDataloc
            {
                let studsmodel = FirebaseStructureCustVM.updateQuestionData(Questiondata: value as![String:Any])

            }

           print((snapshot))
                   })