在本教程中,您将学习如何在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将创建一个配置文件供您包含在您的项目中。 如图所示,下载配置文件并将其添加到Xcode项目的根目录。
这是我的项目文件夹结构的屏幕截图,其中突出显示了GoogleService配置文件。
接下来,您需要安装CocoaPods for Firebase。 CocoaPods使您可以轻松地在Xcode项目中安装和管理外部依赖项,例如第三方库或框架。 如果您还没有Podfile ,请按照说明创建一个Podfile 。 然后将Firebase核心服务添加到您的Podfile中并运行pod install
。
接下来,Firebase安装向导将为您提供一些代码以添加到您的AppDelegate
。 将下面突出显示的行复制到您的AppDelegate文件中。
完成所有这些步骤后,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)
})
}
}
运行上面的代码,您应该看到status
为true
。 如果转到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