如何仅从 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.