如何仅从 firebase 数据库中检索节点?
How to retrieve only the nodes from firebase database?
我有一个应用程序,用户可以在其中创建任务供他们全天完成。类似于待办事项列表。我的 firebase 数据库中有一个名为 "Tasks"
的节点,在此节点下是添加所有任务的地方。
这是一个直观的例子:
我当然可以向 firebase 数据库添加数据。这是相关代码:
taskTitle = titleTextField.text!
taskDescription = notesTextView.text
var tasks: [String: Any] = [:] // declaring empty dictionary
tasks["Description"] = taskDescription
tasks["Due Date"] = date_time
database.child("Tasks").child(taskTitle).setValue(tasks)
所以如果用户创建了一个新任务,让我们假设他们创建了 "TASK 4"
、"TASK 5"
、"TASK 6"
,它将看起来像这样:
这里是 jason 数据打印:
Tasks = {
"Task 1" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 2" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 3" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 4" = {
Description = Notes;
"Due Date" = "";
};
"Task 5" = {
Description = Run;
"Due Date" = "Nov 24, 2021, 12:11";
};
"Task 6" = {
Description = Run;
"Due Date" = "Nov 24, 2021, 12:11";
};
};
}
打印此快照的代码如下:
var postRef: DatabaseReference? // declared outside of viewDidLoad()
var refHandle: DatabaseHandle? // declared outside of viewDidLoad()
//set the db ref
postRef = Database.database().reference()
//getting values from db
refHandle = postRef?.observe(DataEventType.value, with: { snapshot in
self.listOftasks.append("")
})
我只是在 self.listoftasks.append("")
处设置断点,然后在控制台中我正在执行 "po snapshot"
,然后打印 JSON 对象。
我需要做什么,只读取任务名称?
首先,如果你只关心任务,你应该只加载 Tasks
节点而不是加载整个数据库
tasksRef = Database.database().reference("Tasks")
接下来,您需要在完成处理程序中遍历子节点:
refHandle = tasksRef?.observe(DataEventType.value, with: { snapshot in
for taskSnapshot in snapshot.children {
print(taskSnapshot.key)
}
})
为此,我还建议您查看之前关于 looping over child nodes in swift 的一些问题,例如:
记住:虽然上面只打印任务的键,它仍然检索每个节点的值。如果您不需要代码中的值,请考虑在数据库中保留一个单独的节点,仅包含任务名称(通常 true
值,因为路径需要一个值才能存在)以减少使用的带宽。
最后,拥有这样的顺序键是 Firebase 中常见的反模式,所以我推荐阅读这个经典 post:Best Practices: Arrays in Firebase.
我有一个应用程序,用户可以在其中创建任务供他们全天完成。类似于待办事项列表。我的 firebase 数据库中有一个名为 "Tasks"
的节点,在此节点下是添加所有任务的地方。
这是一个直观的例子:
我当然可以向 firebase 数据库添加数据。这是相关代码:
taskTitle = titleTextField.text!
taskDescription = notesTextView.text
var tasks: [String: Any] = [:] // declaring empty dictionary
tasks["Description"] = taskDescription
tasks["Due Date"] = date_time
database.child("Tasks").child(taskTitle).setValue(tasks)
所以如果用户创建了一个新任务,让我们假设他们创建了 "TASK 4"
、"TASK 5"
、"TASK 6"
,它将看起来像这样:
这里是 jason 数据打印:
Tasks = {
"Task 1" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 2" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 3" = {
Description = Abcderf;
"Due Date" = "Nov 17, 2021, 19:11";
};
"Task 4" = {
Description = Notes;
"Due Date" = "";
};
"Task 5" = {
Description = Run;
"Due Date" = "Nov 24, 2021, 12:11";
};
"Task 6" = {
Description = Run;
"Due Date" = "Nov 24, 2021, 12:11";
};
};
}
打印此快照的代码如下:
var postRef: DatabaseReference? // declared outside of viewDidLoad()
var refHandle: DatabaseHandle? // declared outside of viewDidLoad()
//set the db ref
postRef = Database.database().reference()
//getting values from db
refHandle = postRef?.observe(DataEventType.value, with: { snapshot in
self.listOftasks.append("")
})
我只是在 self.listoftasks.append("")
处设置断点,然后在控制台中我正在执行 "po snapshot"
,然后打印 JSON 对象。
我需要做什么,只读取任务名称?
首先,如果你只关心任务,你应该只加载 Tasks
节点而不是加载整个数据库
tasksRef = Database.database().reference("Tasks")
接下来,您需要在完成处理程序中遍历子节点:
refHandle = tasksRef?.observe(DataEventType.value, with: { snapshot in
for taskSnapshot in snapshot.children {
print(taskSnapshot.key)
}
})
为此,我还建议您查看之前关于 looping over child nodes in swift 的一些问题,例如:
记住:虽然上面只打印任务的键,它仍然检索每个节点的值。如果您不需要代码中的值,请考虑在数据库中保留一个单独的节点,仅包含任务名称(通常 true
值,因为路径需要一个值才能存在)以减少使用的带宽。
最后,拥有这样的顺序键是 Firebase 中常见的反模式,所以我推荐阅读这个经典 post:Best Practices: Arrays in Firebase.