Datos de TableViewCell de la database Firebase

Entonces, básicamente, quiero get los agujeros de mi database y ponerlos en la tablaView, pero realmente no sé cómo. No puedo averiguar cómo obtengo las celdas para get el título del número del Hoyo.

Aquí está mi database: Estructura

Aquí está mi viewcontroller:

import UIKit import Firebase class HolesViewController: UITableViewController { //FirebaseRefrences var ref = FIRDatabaseReference.init() var holes: [FIRDataSnapshot]! = [] override func viewDidLoad() { //ViewDidLoad //Refrences to Firebase ref = FIRDatabase.database().reference() let CoursesRef = ref.child("Courses") //snapshot CoursesRef.observeEventType(.ChildAdded, withBlock: { snapshpt in self.holes.append(snapshpt) self.tableView.reloadData() }) } override func viewDidAppear(animated: Bool) { //ViewDidAppear } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.holes.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("HoleCell") let holesSnap = self.holes[indexPath.row] /* ?????? */ return cell } override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { return true } } 

Como puedo ver, su matriz de holes es en realidad una matriz de instantáneas de curso.

Si desea una matriz con todos los agujeros de todos los cursos, necesitará trabajar con los siguientes

 self.holes = snapshpt.childSnapshotForPath("Holes").children.allObjects as [FIRDataSnapshot] 

Si desea get solo los agujeros para un Curso específico, debería recuperar sus datos de esta manera.

 ref.child("Courses").child(courseId).child("Holes").observeEventType(.ChildAdded withBlock: { snapshot in self.holes.append(snapshot) } 

Una vez que tiene las instantáneas Holes (una instantánea para cada agujero) en los holes[indexPath.row] , solo tiene que establecer la celda textLabel en el valor de instantánea.

 cell.textLabel = holes[indexPath.row].value as! String 

Te daré información sobre este tema y haré todo lo posible para convencerte de que no lo hagas de esta manera.

Primero, dada la siguiente estructura:

 courses course_01 holes 1: hole 1 2: hole 2 3: hole 3 name: course name 1 course_02 holes 0: hole 0 1: hole 1 2: hole 2 name: course name 2 

y un código Firebase para leer los datos

  self.myRootRef.childByAppendingPath("courses/course_01") thisCourseRef.observeSingleEventOfType(.Value, withBlock: { snapshot in let name = snapshot.value["name"] as! String let holes = snapshot.value["holes"] as! NSArray print(name) print(holes) }) 

Lo primero que debe notar es que Firebase es compatible directamente con NSArray, por lo que puede leer fácilmente los agujeros directamente en una matriz 'agujeros'

Cuando se ejecuta el código para course_01, estos son los resultados.

 course name 1 ( "<null>", "hole 1", "hole 2", "hole 3" ) 

y luego cuando lo ejecutamos para course_02 …

 course name 2 ( "hole 0", "hole 1", "hole 2" ) 

Array's en Firebase están basados ​​en cero, por lo que asigna NULL al elemento 0 en el primer ejemplo. Entonces, el agujero # 1 realmente debería ser el 0 ° elemento en el array en Firebase.

Dicho eso, digamos que hay un evento especial, el día nacional # 7. Entonces quieres cambiar el nombre del hoyo # 7 a otra cosa … di 'Hoyo 7, el hoyo que más te importa'

Con las matrices Firebase, debe leer y sobreescribir todo el nodo (el nodo 'agujero', jajaja) ya que no puede acceder a elementos individuales en una matriz.

La mejor opción es formatear su estructura de Firebase de esta manera:

 holes -Y9989jaik9 name: hole 0 hole_num: 0 -Juiijaie898 name: hole 1 hole_num: 1 . . . -Ykmi9mms9889 name: Hole 7, the hole that cares hole_num: 7 

y lo que lo hace genial es que puede cambiar el nombre de los agujeros sobre la marcha sin editar o actualizar los datos en los otros agujeros.

La línea inferior es la matriz de Firebase son muy situacionales y generalmente se pueden evitar.

Espero que ayude.