我有一个搜索栏,当你输入它时会在数据库中搜索该用户的用户名。找到用户名的代码可以工作,但是当我尝试读取特定值时,它会崩溃。这是代码
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中清楚地显示它返回的数据是否存在却不会让我抽出值?
答案 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
}