• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何在 iOS 应用中使用 Firebase Firestore 数据库

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

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

数据、文档和集合

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

数据

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

  • String

  • Number

  • Boolean

  • Map

  • Array

  • Null

  • Timestamp

  • Geopoint

  • Reference

文件

文档 包含一组键值对中的数据项。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。

如何在 iOS 应用中使用 Firebase Firestore 数据库  第1张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第2张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第3张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第4张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第5张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第6张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第7张

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

如何在 iOS 应用中使用 Firebase Firestore 数据库  第8张

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

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

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

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

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

在此代码中,querySnapshot 包含返回的数据。如果没有带有 name 的集合,它将为零 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)
        }
    }
}

让我们试试吧!使用下面的代码 completeList从ToDoListViewController. 

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 再次尝试调用该方法。

将任务添加到集合

让我们 addToList 在ListService().

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

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

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使用正确的文档 ID 更新。

让我们通过调用 addToListfrom添加一些测试数据ViewController。运行以下代码后,返回控制台,您会看到添加了一个条目。现在,运行 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)
        }
    }
}

让我们 deleteFromList从 ToDoListViewController. 我们将从Firebase 控制台复制 的“购买杂货”的文档 ID 传递给它。

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任务、添加新任务和滑动手势来删除任务。试试看!


文章目录
  • 数据、文档和集合
    • 数据
    • 文件
    • 收藏品
  • 创建新的 Firebase 应用
  • 在 Firebase 应用中处理数据
  • 从集合中读取任务
    • 将任务添加到集合
    • 在 Firestore 中删除任务文档
  • 结论
  • 发表评论