2016-07-01 5 views
1

Ivには検索バーがあり、入力するとそのユーザのユーザ名のデータベースが検索されます。ユーザー名を見つけるコードが動作しますが、特定の値を試してみるとクラッシュします。これは、スナップショットを印刷するからコードFirebase 2.0 - FIRDataSnapshotからのデータの読み込みが正しくありません

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に表示されていれば、そのデータはそこにあると返しましたが、私は値をexstractしませんか?

答えて

5

スナップショットには、子供の第1レベルの値「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; 
}; 

2

スナップショットプロパティにアクセスしようとすると、childSnapshot(forPath:)を使用すると別の例のhereが表示されます。

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

しかし、基本的には次のようになります。

関連する問題