如何在iOS应用中使用Firebase Firestore

在本教程中,您将学习如何在Firebase Firestore数据库中管理数据。

有关Firebase的一些背景知识以及有关如何设置Firestore数据库的说明,请阅读我之前的Firebase简介文章。

数据,文档和集合

使用Firestore,数据,文档和集合是我们需要了解的关键概念。

数据

数据可以是以下任何一种:

  • 布尔型
  • 地图
  • 数组
  • 空值
  • 时间戳记
  • Geopoint
  • 参考
文件资料

文件资料 在一组键值对中包含数据项。 Firebase Firestore经过优化,可以存储大量文档。 文档是具有字段映射到值的轻量级记录。 每个文档都由一个名称标识。

例如,我们可以将Country文档描述如下:

Country
    Name: "Canada"
    Capital: "Ottawa"

在此,“ Country是包含两个字段的文档:“ Name和“ Capital

馆藏

集合包含文档集。 文件存放在集合中,集合只是文件的容器。 例如,您可能有一个“ Countries集合来包含您的各个国家/地区,每个国家/地区都由一个文档表示:

Countries 
    Country
        Name: “India”
        Capital: “New Delhi”
    Country
        Name: “England”
        Capital: “London"

简而言之, 数据文档的一部分,该文档属于集合

通过构建示例应用程序,我们将了解有关数据,文档和集合的更多信息。

创建一个新的Firebase应用

首先,您需要创建一个新的Xcode项目并在Firebase Firestore门户中进行设置。

首先,使用Xcode创建一个项目并将其命名为ToDoApp 。 然后,在Firebase中创建一个相应的项目,并将其命名为ToDoApp

在Firebase中创建一个项目并将其命名为ToDoApp

接下来,使用捆绑标识符注册您的应用。

注册应用

Firebase将创建一个配置文件供您包含在您的项目中。 如图所示,下载配置文件并将其添加到Xcode项目的根目录。

下载GoogleService配置文件

这是我的项目文件夹结构的屏幕截图,其中突出显示了GoogleService配置文件。

项目文件夹中的GoogleService配置文件

接下来,您需要安装CocoaPods for Firebase。 CocoaPods使您可以轻松地在Xcode项目中安装和管理外部依赖项,例如第三方库或框架。 如果您还没有Podfile ,请按照说明创建一个Podfile 。 然后将Firebase核心服务添加到您的Podfile中并运行pod install

初始化并添加所需的Pod

接下来,Firebase安装向导将为您提供一些代码以添加到您的AppDelegate 。 将下面突出显示的行复制到您的AppDelegate文件中。

将初始化代码添加到您的AppDelegate文件

完成所有这些步骤后,Firebase中的项目设置屏幕将如下所示:

Firebase项目设置屏幕正在等待验证

要完成安装,您需要使您的应用程序与Firebase服务器通信。 只需运行您的Xcode项目并返回Firebase中的项目设置屏幕,您应该会看到类似以下内容:

成功验证安装

在Firebase应用中处理数据

现在我们完成了初始设置,让我们开始在应用程序中处理数据。

在本教程的这一部分中,我们将创建一个应用程序来编辑,删除和读取有关任务的数据。 但是在开始添加或创建任务之前,我们需要考虑任务所需的字段。 由于这是一个简单的应用程序,因此我们将坚持一个字段:

  • task_details :描述任务的文本

我们还需要一个集合,我们将其命名为tasks ,它将包含这些Task文档。 这是结构的外观:

tasks
    Task
        task_details
    Task
        task_details

为了表示这些数据,让我们在中创建一个简单的任务模型类 TaskModel.swift具有以下代码:

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类。 然后,在Main.storyboard中添加ToDoListViewController并将其连接到ToDoListViewController.swift 。 在情节ToDoListViewController中将UITableView添加到ToDoListViewController并实现委托。

现在,我们将创建ListService.swift来保存代码以检索任务数据。 从导入开始   FirebaseFirestore 。 然后创建一个Firestore实例  Firestore.firestore()ListService.swift应该如下所示:

import Foundation
import FirebaseFirestore

class ListService {
    let db = Firestore.firestore()
}

接下来,我们将在其中添加completeList方法   ListService类。 我们将使用Firebase中的getDocuments()方法从tasks集合中获取所有数据和文档。 这将返回数据或错误。

func completeList(completion: @escaping (Bool, [TaskModel]) -> ()){
    db.collection("tasks").getDocuments() { (querySnapshot, err) in
    }
}

在此代码中, querySnapshot包含返回的数据。 如果没有名称为tasks集合,则为零。

这是completeList函数的其余部分:它检索任务数据并使用任何检索到的数据调用完成回调。

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)
        }
    }
}

让我们尝试一下! 使用下面的代码从ToDoListViewController调用completeList

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将为nil。 在下一节中,我们将添加一些数据,然后尝试调用completeList   再次的方法。

将任务添加到集合

让我们在ListService()创建一个addToList方法。

func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) {
    completion(false)
}

我们将使用传入的任务描述来创建taskData实例,并将其添加到tasks集合中。 为此,我们将使用Firestore Firebase中的addDocument方法。

func addToList(taskDescription: String, completion: @escaping (Bool) -> ()) {
        var ref: DocumentReference? = nil

        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)
                }
        }
    }

如果没有错误,我们将打印文档ID,并在完成块中返回true。 task_id将是 文件编号。 现在,我们只发送空字符串,但最终我们将使用正确的文档ID更新task_id

让我们通过从ViewController调用addToList添加一些测试数据。 运行以下代码后,返回控制台,您将看到已添加条目。 现在,运行getAllTasks() 应该返回true并且任务计数为1。

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控制台,并记下“ 购买杂货 ”的文档ID值。 我们将根据文件ID删除文件。

现在,添加一个deleteFromList ListService方法,如下所示。

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)
        }
    }
}

让我们从ToDoListViewController调用deleteFromList 。 我们将向其传递从Firebase控制台复制的文档ID“ Buy Groceries”

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)
        })
    }
}

运行上面的代码,您应该看到statustrue 。 如果转到Firebase Firestore控制台,则应该看到“ Buy Groceries ”任务已被删除。

结论

到此为止,您已经了解了如何从Firebase Firestore数据库中创建,读取和删除数据。 在本教程中,我们构建了一个应用程序来使用Xcode和Firebase管理任务。 希望这为您提供了一些新技能,您可以在即将进行的项目中将它们付诸实践。

为了使该应用程序更具功能,您可以实现表视图委托方法以在数据库中显示任务, UITextField用于添加新任务,以及滑动手势以删除任务。 试试看!

如有任何疑问,请在下面的评论中告诉我。

翻译自: https://code.tutsplus.com/tutorials/how-to-use-firebase-firestore-in-an-ios-app--cms-32216

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值