Cómo usar Firestore de Firebase en una aplicación iOS
Spanish (Español) translation by lás (you can also view the original English article)
En este tutorial, aprenderá cómo administrar datos en una base de datos Firestore de Firebas.
Para obtener algunos antecedentes sobre Firebase e instrucciones sobre cómo configurar su base de datos de Firestore, lea mi publicación anterior Introducción a Firebase.
Datos, documentos y colecciones
Trabajar con Firestore, datos, documentos y colecciones son
los conceptos clave que debemos entender.
Datos
Los datos pueden ser cualquiera de los siguientes tipos:
- String (Cadenas)
- Number (Numeros)
- Boolean (Booleano)
- Map (Mapa)
- Array (matriz)
- Null (Nulo)
- Timestamp (Marca de tiempo)
- Geopoint (Geopunto)
- Reference (Referencia)
Documentos
Los documentos contienen elementos de datos en un conjunto de pares clave-valor. Firebase Firestore está optimizado para almacenar grandes colecciones de documentos. Un documento es un registro ligero con campos que se asignan a valores. Cada documento se identifica por un nombre.
Por ejemplo, podríamos describir un documento Country de la siguiente manera:
1 |
Country |
2 |
Name: "Canada" |
3 |
Capital: "Ottawa" |
Aquí, Country (País) es el documento que contiene dos campos: Name (Nombre) y Capital.
Colecciones
Las colecciones contienen conjuntos de documentos. Los
documentos viven en colecciones, que son simplemente contenedores para documentos. Por ejemplo, podría tener una colección de países para contener sus diversos Countries (países), cada uno representado por un documento:
1 |
Countries |
2 |
Country |
3 |
Name: “India” |
4 |
Capital: “New Delhi” |
5 |
Country |
6 |
Name: “England” |
7 |
Capital: “London" |
En resumen, los datos son parte de un documento, que pertenece a una colección.
Aprenderemos más sobre datos, documentos y colecciones creando una aplicación muestra.
Creando una nueva aplicación Firebase
Para comenzar, deberá crear un nuevo proyecto Xcode y configurarlo en el portal Firestore de Firebase.
Primero, cree un proyecto en Xcode y asígnele el nombre ToDoApp. Luego, crea un proyecto correspondiente en Firebase y también llámalo ToDoApp.



A continuación, registre su aplicación con un identificador de paquete.



Firebase creará un archivo de configuración para que lo incluyas en tu proyecto. Descarga el archivo de configuración y agrégalo a la raíz de su proyecto Xcode como se ve.



Aquí hay una captura de pantalla de la estructura de la carpeta de mi proyecto con el archivo de configuración de GoogleService resaltado.

A continuación, debes instalar CocoaPods para Firebase. CocoaPods facilita la instalación y administración de dependencias externas, como bibliotecas o marcos de terceros en sus proyectos de Xcode. Si aún no tienes un Podfile, siga las instrucciones para crear uno. Luego agrega los servicios básicos de Firebase a Podfile y ejecuta pod install.



A continuación, el asistente de configuración de Firebase dará un código para agregar a AppDelegate. Copie las líneas resaltadas a continuación en el archivo AppDelegate.



Cuando haya completado todos estos pasos, la pantalla de configuración del proyecto en Firebase se verá así:



Para completar la instalación, debe hacer que su aplicación se comunique con el servidor Firebase. Simplemente ejecute su proyecto Xcode y regrese a la pantalla de configuración del proyecto en Firebase, y debería ver algo como esto:



Manejo de datos en una aplicación Firebase
Ahora que hemos terminado con la configuración inicial, comencemos a manejar los datos en nuestra aplicación.
En esta sección del tutorial, crearemos una aplicación para editar, eliminar y leer datos sobre tareas. Pero antes de comenzar a agregar o crear tareas, debemos pensar en los campos que necesitaríamos para una tarea. Dado que esta es una aplicación simple, nos quedaremos con un solo campo:
-
task_details: texto que describe la tarea
También necesitamos una colección, que nombraremos tasks (tareas), y contendrá estos documentos Task (tarea). Así es como se verá la estructura:
1 |
tasks |
2 |
Task |
3 |
task_details |
4 |
Task |
5 |
task_details |
Para representar estos datos, creemos una clase de modelo task simple en TaskModel.swift con el siguiente código:
1 |
import Foundation |
2 |
|
3 |
public struct TaskModelDetails { |
4 |
var taskDetails: String |
5 |
|
6 |
init(taskDetails: String){ |
7 |
self.taskDetails = taskDetails |
8 |
}
|
9 |
}
|
10 |
|
11 |
class TaskModel { |
12 |
var task: TaskModelDetails |
13 |
|
14 |
init(task: TaskModelDetails) { |
15 |
self.task = TaskModelDetails(taskDetails: task.taskDetails) |
16 |
}
|
17 |
}
|
Tareas de lectura de la colección
Mostraremos las tareas en una vista de tabla simple.
Primero, creemos una clase ToDoListViewController.swift. Luego, agregue ToDoListViewController en Main.storyboard y conéctelo a ToDoListViewController.swift. Agregue un UITableView a ToDoListViewController en el storyboard e implemente delegados.
Ahora crearemos ListService.swift para guardar el código para recuperar los datos de la tarea. Comience importando FirebaseFirestore. Luego cree una instancia de Firestore con Firestore.firestore(). ListService.swift debería tener el siguiente aspecto:
1 |
import Foundation |
2 |
import FirebaseFirestore |
3 |
|
4 |
class ListService { |
5 |
let db = Firestore.firestore() |
6 |
}
|
A continuación, agregaremos el método completeList en la clase ListService. Obtendremos todos los datos y documentos de la colección tasks mediante el método getDocuments() de Firebase. Esto devolverá datos o un error.
1 |
func completeList(completion: @escaping (Bool, [TaskModel]) -> ()){ |
2 |
db.collection("tasks").getDocuments() { (querySnapshot, err) in |
3 |
}
|
4 |
}
|
En este código, querySnapshot contiene los datos devueltos. Será nulo si no hay una colección con el nombre tasks.
Aquí está el resto de la función completeList: recupera los datos de la tarea y llama a la devolución de llamada de finalización con los datos recuperados.
1 |
func completeList(completion: @escaping (Bool, [TaskModel]) -> ()){ |
2 |
var tasks = [TaskModel]() |
3 |
db.collection("tasks").getDocuments() { (querySnapshot, err) in |
4 |
if let err = err { |
5 |
print("Error getting documents: \(err)") |
6 |
completion(false, tasks) |
7 |
} else { |
8 |
for document in querySnapshot!.documents { |
9 |
print("\(document.documentID) => \(document.data())") |
10 |
}
|
11 |
completion(true, tasks) |
12 |
}
|
13 |
}
|
14 |
}
|
¡Probémoslo! Use el siguiente código para llamar a completeList desde ToDoListViewController.
1 |
import Foundation |
2 |
import UIKit |
3 |
|
4 |
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{ |
5 |
let taskService = ListService() |
6 |
override func viewDidLoad() { |
7 |
super.viewDidLoad() |
8 |
getAllTasks() |
9 |
}
|
10 |
|
11 |
func getAllTasks() { |
12 |
taskService.completeList(completion: { (status, tasks) in |
13 |
print(status) |
14 |
})
|
15 |
}
|
16 |
}
|
No debería haber errores, pero querySnapshot será nulo ya que todavía no tenemos ningún documento en nuestra colección. En la siguiente sección, agregaremos algunos datos y luego intentaremos llamar al método completeList nuevamente.
Agregando tareas a la colección
Creemos un método addToList en ListService().
1 |
func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) { |
2 |
completion(false) |
3 |
}
|
Usamos la descripción de la tarea pasada para crear una instancia taskData y agregarla a la colección tasks. Para hacer esto, usaremos el método addDocument de Firestore Firebase.
1 |
func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) { |
2 |
var ref: DocumentReference? = nil |
3 |
|
4 |
ref = db.collection("tasks").addDocument(data: [ |
5 |
"task_details": taskDescription, |
6 |
"task_id" : "", |
7 |
]) { err in |
8 |
if let err = err { |
9 |
print("Error adding document: \(err)") |
10 |
completion(false) |
11 |
} else { |
12 |
print("Document added with ID: \(ref!.documentID)") |
13 |
completion(true) |
14 |
}
|
15 |
}
|
16 |
}
|
Si no hay ningún error, imprimiremos la identificación del documento y devolveremos verdadero en nuestro bloque de finalización. task_id será la identificación del documento. Por ahora, solo enviaremos la cadena vacía, pero eventualmente actualizaremos el task_id con la identificación correcta del documento.
Agreguemos algunos datos de prueba llamando a addToList desde ViewController. Después de ejecutar el siguiente código, regrese a la consola y verá que se agregó una entrada. Ahora, ejecutar getAllTasks() debería devolver true y un recuento de tareas a 1.
1 |
import Foundation |
2 |
import UIKit |
3 |
|
4 |
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{ |
5 |
|
6 |
let taskService = ListService() |
7 |
override func viewDidLoad() { |
8 |
super.viewDidLoad() |
9 |
addTask(taskText: "Buy Grocery") |
10 |
getAllTasks() |
11 |
}
|
12 |
|
13 |
func addTask(taskText: String) { |
14 |
taskService.addToList(taskDescription: text, completion: { (status) in |
15 |
if status { |
16 |
print("Status", status) |
17 |
}
|
18 |
})
|
19 |
}
|
20 |
|
21 |
func getAllTasks() { |
22 |
taskService.completeList(completion: { (status, tasks) in |
23 |
print(tasks.count) |
24 |
})
|
25 |
}
|
26 |
}
|
Por supuesto, en una aplicación real, ¡querrás crear una interfaz de usuario para agregar tareas!.
Eliminar un documento de tarea en Firestore
Finalmente, veamos cómo podemos eliminar un documento en Firestore. Vuelva a la consola de Firebase Firestore y tome nota del valor de identificación del documentopara "Buy Groceries" ("Comprar comestibles"). Vamos a eliminar el documento según la identificación del documento.
Ahora, agregue un método deleteFromList a ListService como se muestra a continuación.
1 |
func deleteFromList(taskId: String, completion: @escaping (Bool) -> ()){ |
2 |
db.collection("tasks").document(taskId).delete() { err in |
3 |
if let err = err { |
4 |
print("Error removing document: \(err)") |
5 |
completion(false) |
6 |
} else { |
7 |
completion(true) |
8 |
}
|
9 |
}
|
10 |
}
|
Llamemos a deleteFromList desde ToDoListViewController. Le pasaremos la identificación del documento de "Buy Groceries", ("Comprar comestibles"), que copiamos de la consola de Firebase.
1 |
import Foundation |
2 |
import UIKit |
3 |
|
4 |
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{ |
5 |
let taskService = ListService() |
6 |
|
7 |
override func viewDidLoad() { |
8 |
super.viewDidLoad() |
9 |
deleteTask(taskId: "ddiqw8bcnalkfhcavr") |
10 |
}
|
11 |
|
12 |
func deleteTask(taskId: String) { |
13 |
taskService.deletFromList(taskId: taskId, completion: { (status) in |
14 |
print(status) |
15 |
})
|
16 |
}
|
17 |
}
|
Al ejecutar el código anterior, debería ver status como true. Si vas a la consola Firestore, deberías ver que la tarea "Buy Groceries" ha sido eliminada.
Conclusión
Con eso, has aprendido cómo crear, leer y eliminar datos de una base de datos de Firebase con Firestore. En este tutorial, creamos una aplicación para administrar tareas usando Xcode y Firebase. Con suerte, esto te ha dado algunas habilidades nuevas que podrá poner en práctica en sus próximos proyectos.
Para que esta aplicación sea más funcional, puede implementar métodos de delegado de vista de tabla para mostrar las tareas de su base de datos, un UITextField para agregar nuevas tareas y un gesto de deslizamiento para eliminar tareas. ¡Pruébalo!
Si tiene alguna pregunta, hágamelo saber en los comentarios.



