2017-12-13 5 views
0
` let query = ref?.child("Reviews").queryOrdered(byChild: "UserID").queryEqual(toValue: myUser.userId) 
     query?.observeSingleEvent(of: .value) { snapshot in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let dict = snap.value as! [String: Any] 
       let uid = dict["UserID"] as! String 
       let review = dict["Body"] as! String 
       let rating = dict["Rating"] as! String 
       let titleID = dict["TitleID"] as! String 
       let reviewID = dict["ReviewID"] as! String 

       let ratingID = dict["RatingID"] as! String 
       ` 

エラーは、データベースのratingID呼び出しで発生します。それはゼロをアンラップする。Firebase xcodeをクラッシュさせずに既存のデータベースに新しいキー/値を追加します。

私は、既存のFirebaseデータベースに新しいキー/値を適用しようとしています。 次に、私のテーブルビューにエントリを表示しようとすると、unwrapでnilを返してクラッシュします。私はなぜこれが起こっているのかを知っています。それは、前のデータには、今後ノードに含める新しいキー/値がないためです。私はletとguardのような多くの異なるものを試してみました。新しいキー/値を追加するにはどうしたら、テーブルビューに新しい値を持たないエントリを読み込ませることができますか?

私は現在のノードのイメージを含み、ノードに「RatingsID」を追加します。私がするとき、私はアンラップnilエラーを取得します。前新しいキー/値

enter image description here

+0

をテストするために割り当てられています! – ROKOKO

+0

問題が発生している場所にコードを含めてください。また、エラーが発生している行のコードも示してください。 [最小限で完全で検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve) – Jay

+0

を参照してください。コードを追加しました。私はすでに問題が何かを知っています、私の問題は、新しいフォーマットのすべてのエントリをやり直すことなく、格付けIDのキー値を持っていない古いエントリをどう扱うかです。つまり、将来的に好きなものを追加し、必要に応じてノードに従うということで、私のキーバリューのペアを適合させたいと思っています。 – ROKOKO

答えて

0

にあなたのコードは、スーパー近い

データベースノード、ちょうどratingIDキーが存在しない場合には、コードを保護する必要があります。

のでRatingIDノードが存在しないのであれば、あなたは空の文字列にratingIDを設定します(またはあなたが好きな文字列)

let ratingID = dict["RatingID"] as! String ?? "" 

let ratingID = dict["RatingID"] as! String 

を変更

ノードが存在する場合、そのキーの値に対してのみ操作するようにコードすることもできます(ゼロではない)

if let someVal = dict["xxx"] { 
    //do something with someVal 
} else { 
    print("xxx node wasn't found") 
} 

完全な例です:メッセージノードからいくつかのメッセージを読んでおり、その中にはtest_keyノードを持っているものもあれば、いくつかありません。そうでないものについては、デフォルトの文字列は、私はネット上でこのどこかへの参照を見つけることができません

let postsRef = self.ref.child("messages") 
postsRef.observe(.childAdded) { snapshot in 
    let dict = snapshot.value as! [String: Any] 
    let msg = dict["msg"] as! String 
    let test = dict["test_key"] ?? "default string" 
    print(msg, test) 
} 
+0

私はそれをしようとすると、まだヘビエムは無限のエラーにラップされて取得?? ""メソッド – ROKOKO

+0

この問題は、その特定のエントリにRatingID値のペアが存在しないことが原因である可能性がありますか? – ROKOKO

+0

私はそれを! 〜に? after as – ROKOKO

関連する問題