Firebase 2.0 - 从FIRDataSnapshot中读取数据不起作用

时间:2016-07-01 01:31:40

标签: swift firebase firebase-realtime-database

我有一个搜索栏,当你输入它时会在数据库中搜索该用户的用户名。找到用户名的代码可以工作,但是当我尝试读取特定值时,它会崩溃。这是代码

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

          Database.child("users").queryOrderedByChild("username").queryEqualToValue(searchText).observeSingleEventOfType(.Value, withBlock: { snapshot in

        print(snapshot)
        print(snapshot.value!["first_name"] as? String)
        print(snapshot.value!["last_name"] as? String)
        print(snapshot.value!["username"] as? String)
        print(snapshot.value!["profile_picture_url"] as? String)
    })
}

打印快照的结果是

Snap (users) {
12345UIDEXample =     {
    "first_name" = Bob;
    "last_name" = Someone;
    "profile_picture_url" = "exampleurl.com";
    username = bobby;
  };
}

但是当我尝试访问时

snapshot.value!["first_name"] as? String

它返回nil并崩溃? 为什么如果它在json中清楚地显示它返回的数据是否存在却不会让我抽出值?

2 个答案:

答案 0 :(得分:5)

您的快照在第一级儿童中包含值“12345UIDEXample”。

要访问您要查找的数据,您可以使用循环播放子项作为FIRDataSnapshot。

for child in snapshot.children.allObjects as! [FIRDataSnapshot]{
    let firstname = child.value!["first_name"] as? String
}

在此示例中,子值将仅返回对象的另一个快照,如下所示:

Snap(12345UIDEXample) {
    "first_name" = Bob;
    "last_name" = Someone;
    "profile_picture_url" = "exampleurl.com";
    username = bobby;
};

但是,您可以像之前尝试的那样访问所需的字段。

答案 1 :(得分:2)

尝试访问“快照”属性时,请使用childSnapshot(forPath:),请参阅另一个示例here

但基本上看起来像:

for child in snapshot.children.allObjects as! [FIRDataSnapshot] { let firstname = child.childSnapshot(forPath: "first_name").value as? String }