Статьи

Как использовать Firebase Firestore в приложении для iOS

Из этого руководства вы узнаете, как управлять данными в базе данных 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»

Короче говоря, данные являются частью документа , который принадлежит коллекции .

Мы узнаем больше о данных, документах и ​​коллекциях, создав пример приложения.

Для начала вам нужно создать новый проект Xcode и настроить его на портале Firebase Firestore.

Сначала создайте проект в Xcode и назовите его ToDoApp . Затем создайте соответствующий проект в Firebase и назовите его ToDoApp .

Создайте проект в Firebase и назовите его ToDoApp

Затем зарегистрируйте свое приложение с идентификатором пакета.

Зарегистрировать приложение

Firebase создаст файл конфигурации для вас, чтобы включить в ваш проект. Загрузите файл конфигурации и добавьте его в корневой каталог вашего проекта XCode, как показано на рисунке.

Загрузите файл конфигурации GoogleService

Вот скриншот структуры папок моего проекта с выделенным файлом конфигурации GoogleService .

Файл конфигурации GoogleService в папке проекта

Далее вам нужно установить CocoaPods для Firebase. CocoaPods упрощает установку и управление внешними зависимостями, такими как сторонние библиотеки или платформы, в ваших проектах XCode. Если у вас нет Podfile , следуйте инструкциям по его созданию. Затем добавьте основные службы Firebase в ваш Podfile и запустите pod install .

Инициализируйте и добавьте необходимые модули

Затем мастер установки Firebase предоставит вам код для добавления в ваш AppDelegate . Скопируйте выделенные строки ниже в свой файл AppDelegate .

Добавьте код инициализации в ваш файл AppDelegate

Когда вы выполните все эти шаги, экран настройки проекта в Firebase будет выглядеть следующим образом:

Экран настройки проекта Firebase, ожидающий подтверждения

Для завершения установки вам нужно, чтобы ваше приложение связывалось с сервером Firebase. Просто запустите ваш проект Xcode и вернитесь к экрану настройки проекта в 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. Вернитесь в консоль 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 для добавления новых задач и жест смахивания для удаления задач. Попробуйте!

Если у вас есть какие-либо вопросы, дайте мне знать в комментариях ниже.