Из этого руководства вы узнаете, как управлять данными в базе данных Firebase Firestore.
Для получения дополнительной информации о Firebase и инструкций по настройке базы данных Firestore, пожалуйста, прочитайте мой предыдущий пост Введение в Firebase .
Данные, документы и коллекции
Работа с Firestore, данные, документы и коллекции — ключевые понятия, которые нам необходимо понять.
Данные
Данные могут быть любого из следующих типов:
- строка
- номер
- логический
- карта
- массив
- Значение NULL
- Отметка
- GeoPoint
- Ссылка
документы
документы содержат элементы данных в наборе пар ключ-значение. Firebase Firestore оптимизирован для хранения больших коллекций документов. Документ представляет собой облегченную запись с полями, которые сопоставляются со значениями. Каждый документ идентифицируется по имени.
Например, мы могли бы описать документ по стране следующим образом:
1
2
3
|
Country
Name: «Canada»
Capital: «Ottawa»
|
Здесь Country
— это документ, который содержит два поля: Name
и Capital
.
Коллекции
Коллекции содержат наборы документов. Документы живут в коллекциях, которые являются просто контейнерами для документов. Например, у вас может быть коллекция Countries
в которой будут содержаться ваши страны, каждая из которых представлена документом:
1
2
3
4
5
6
7
|
Countries
Country
Name: “India”
Capital: “New Delhi”
Country
Name: “England”
Capital: “London»
|
Короче говоря, данные являются частью документа , который принадлежит коллекции .
Мы узнаем больше о данных, документах и коллекциях, создав пример приложения.
Создание нового приложения Firebase
Для начала вам нужно создать новый проект Xcode и настроить его на портале Firebase Firestore.
Сначала создайте проект в Xcode и назовите его ToDoApp . Затем создайте соответствующий проект в Firebase и назовите его ToDoApp .
Затем зарегистрируйте свое приложение с идентификатором пакета.
Firebase создаст файл конфигурации для вас, чтобы включить в ваш проект. Загрузите файл конфигурации и добавьте его в корневой каталог вашего проекта XCode, как показано на рисунке.
Вот скриншот структуры папок моего проекта с выделенным файлом конфигурации GoogleService .
Далее вам нужно установить CocoaPods для Firebase. CocoaPods упрощает установку и управление внешними зависимостями, такими как сторонние библиотеки или платформы, в ваших проектах XCode. Если у вас нет Podfile , следуйте инструкциям по его созданию. Затем добавьте основные службы Firebase в ваш Podfile и запустите pod install
.
Затем мастер установки Firebase предоставит вам код для добавления в ваш AppDelegate
. Скопируйте выделенные строки ниже в свой файл AppDelegate .
Когда вы выполните все эти шаги, экран настройки проекта в Firebase будет выглядеть следующим образом:
Для завершения установки вам нужно, чтобы ваше приложение связывалось с сервером Firebase. Просто запустите ваш проект Xcode и вернитесь к экрану настройки проекта в Firebase, и вы должны увидеть что-то вроде этого:
Обработка данных в приложении Firebase
Теперь, когда мы закончили с начальной настройкой, давайте начнем обрабатывать данные в нашем приложении.
В этом разделе руководства мы создадим приложение для редактирования, удаления и чтения данных о задачах. Но прежде чем мы начнем добавлять или создавать задачи, нам нужно подумать о полях, которые нам потребуются для задачи. Поскольку это простое приложение, мы будем придерживаться одного поля:
-
task_details
: текст, описывающий задачу
Нам также нужна коллекция, которую мы будем называть tasks
, и она будет содержать эти документы. Вот как будет выглядеть структура:
1
2
3
4
5
|
tasks
Task
task_details
Task
task_details
|
Чтобы представить эти данные, давайте создадим простой класс модели задач в TaskModel.swift с кодом ниже:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
import Foundation
public struct TaskModelDetails {
var taskDetails: String
init(taskDetails: String){
self.taskDetails = taskDetails
}
}
class TaskModel {
var task: TaskModelDetails
init(task: TaskModelDetails) {
self.task = TaskModelDetails(taskDetails: task.taskDetails)
}
}
|
Чтение заданий из коллекции
Мы будем отображать наши задачи в простом табличном представлении.
Сначала создадим класс ToDoListViewController.swift . Затем добавьте ToDoListViewController
в Main.storyboard и подключите его к ToDoListViewController.swift . Добавьте UITableView
в ToDoListViewController
в раскадровке и реализуйте делегатов.
Теперь мы создадим ListService.swift для хранения кода для получения данных задачи. Начните с импорта FirebaseFirestore
. Затем создайте экземпляр Firestore с Firestore.firestore()
. ListService.swift должен выглядеть следующим образом:
1
2
3
4
5
6
|
import Foundation
import FirebaseFirestore
class ListService {
let db = Firestore.firestore()
}
|
Далее мы добавим метод completeList
в класс ListService
. Мы получим все данные и документы из коллекции tasks
с помощью getDocuments()
из Firebase. Это вернет либо данные, либо ошибку.
1
2
3
4
|
func completeList(completion: @escaping (Bool, [TaskModel]) -> ()){
db.collection(«tasks»).getDocuments() { (querySnapshot, err) in
}
}
|
В этом коде querySnapshot
содержит возвращенные данные. Это будет ноль, если нет коллекции с именем tasks
.
Вот остальная часть функции completeList
: она извлекает данные задачи и вызывает обратный вызов завершения с любыми найденными данными.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
func completeList(completion: @escaping (Bool, [TaskModel]) -> ()){
var tasks = [TaskModel]()
db.collection(«tasks»).getDocuments() { (querySnapshot, err) in
if let err = err {
print(«Error getting documents: \(err)»)
completion(false, tasks)
} else {
for document in querySnapshot!.documents {
print(«\(document.documentID) => \(document.data())»)
}
completion(true, tasks)
}
}
}
|
Давайте попробуем это! Используйте код ниже для вызова completeList
из ToDoListViewController
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
import Foundation
import UIKit
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{
let taskService = ListService()
override func viewDidLoad() {
super.viewDidLoad()
getAllTasks()
}
func getAllTasks() {
taskService.completeList(completion: { (status, tasks) in
print(status)
})
}
}
|
Не должно быть никаких ошибок, но querySnapshot
будет нулевым, так как у нас еще нет документов в нашей коллекции. В следующем разделе мы добавим некоторые данные, а затем попробуем вызвать completeList
метод снова.
Добавление задач в коллекцию
Давайте создадим метод ListService()
в ListService()
.
1
2
3
|
func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) {
completion(false)
}
|
Мы будем использовать переданное описание задачи, чтобы создать экземпляр taskData
и добавить его в коллекцию tasks
. Для этого мы будем использовать метод addDocument
из Firestore Firebase.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) {
var ref: DocumentReference?
ref = db.collection(«tasks»).addDocument(data: [
«task_details»: taskDescription,
«task_id» : «»,
]) { err in
if let err = err {
print(«Error adding document: \(err)»)
completion(false)
} else {
print(«Document added with ID: \(ref!.documentID)»)
completion(true)
}
}
}
|
Если ошибки нет, мы напечатаем идентификатор документа и вернем true в нашем блоке завершения. task_id
будет идентификатор документа Сейчас мы просто отправим пустую строку, но в итоге обновим task_id
с правильным идентификатором документа.
Давайте добавим некоторые тестовые данные, вызвав addToList
из ViewController
. После запуска приведенного ниже кода вернитесь в консоль, и вы увидите, что запись была добавлена. Теперь запускаем getAllTasks()
должен вернуть true
и количество задач 1.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import Foundation
import UIKit
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{
let taskService = ListService()
override func viewDidLoad() {
super.viewDidLoad()
addTask(taskText: «Buy Grocery»)
getAllTasks()
}
func addTask(taskText: String) {
taskService.addToList(taskDescription: text, completion: { (status) in
if status {
print(«Status», status)
}
})
}
func getAllTasks() {
taskService.completeList(completion: { (status, tasks) in
print(tasks.count)
})
}
}
|
Конечно, в реальном приложении вы захотите создать пользовательский интерфейс для добавления задач!
Удаление документа задачи в Firestore
Наконец, давайте посмотрим, как мы можем удалить документ в Firestore. Вернитесь в консоль Firebase Firestore и запишите значение идентификатора документа для « Buy Groceries ». Мы будем удалять документ на основе идентификатора документа.
Теперь добавьте deleteFromList
метод нашего ListService
как показано ниже.
01
02
03
04
05
06
07
08
09
10
|
func deleteFromList(taskId: String, completion: @escaping (Bool) -> ()){
db.collection(«tasks»).document(taskId).delete() { err in
if let err = err {
print(«Error removing document: \(err)»)
completion(false)
} else {
completion(true)
}
}
}
|
Давайте вызовем deleteFromList
из ToDoListViewController
. Мы передадим ему идентификатор документа « Buy Groceries» , который мы скопировали из консоли Firebase.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
import Foundation
import UIKit
class ToDoListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate{
let taskService = ListService()
override func viewDidLoad() {
super.viewDidLoad()
deleteTask(taskId: «ddiqw8bcnalkfhcavr»)
}
func deleteTask(taskId: String) {
taskService.deletFromList(taskId: taskId, completion: { (status) in
print(status)
})
}
}
|
Запустив приведенный выше код, вы должны увидеть status
true
. Если мы перейдем к консоли Firebase Firestore, то увидим, что задача « Купить продукты » была удалена.
Вывод
Благодаря этому вы узнали, как создавать, считывать и удалять данные из базы данных Firebase Firestore. В этом уроке мы создали приложение для управления задачами с использованием Xcode и Firebase. Надеюсь, это дало вам новые навыки, которые вы сможете применить на практике в своих будущих проектах.
Чтобы сделать это приложение более функциональным, вы можете реализовать методы делегирования табличного представления для отображения задач в вашей базе данных, UITextField
для добавления новых задач и жест смахивания для удаления задач. Попробуйте!
Если у вас есть какие-либо вопросы, дайте мне знать в комментариях ниже.