2017-08-20 5 views
0

私は自分のアプリにFirebaseをリンクしました。 DBからデータを読み込もうとすると、スナップショットにデータが存在します。しかし、子供が読むと、それはnilを返します。ここでスウィフト3:子供がいるときにFirebaseDBがnilを返す

コードです:

Console log

ログ:

  1. 辞書は辞書を印刷から来た

    func checkForDuplicateScan(qrCode: String) { 
    
        DataService.ds.REF_SAMPLES.observeSingleEvent(of: .value, with: { (snapshot) in 
    
         if let dict = snapshot.value as? [String:Any] { 
          print(dict) 
          print(qrCode) 
          print(dict["\(qrCode)"]) 
          if let sampleDict = dict[qrCode] as? [String:Any] { 
           print(sampleDict) 
           if let isScanned = sampleDict["scanned"] as? Bool { 
            if isScanned == true { 
             print("Already Scanned") 
             let alert = UIAlertController(title: "Already Redeemed", message: "This offer has already been redeemed by you. Stay tuned.", preferredStyle: UIAlertControllerStyle.alert) 
             alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (alert) in 
              self.tabBarController?.selectedIndex = 0 
             })) 
             self.present(alert, animated: true, completion: nil) 
            } else { 
             print("New Scan") 
             self.updateQRCode(qrCode: qrCode) 
            } 
           } else { 
            print("Error: can't read/find 'scanned' ") 
           } 
          }else { 
           print("Error: Invalid Code Scanned") 
           let alert = UIAlertController(title: "Invalid QR Code Scanned", message: "The code that you've scanned is Invalid.", preferredStyle: UIAlertControllerStyle.alert) 
           alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (alert) in 
            self.tabBarController?.selectedIndex = 0 
           })) 
           self.present(alert, animated: true, completion: nil) 
          } 
         } else { 
          print("Error: can't get dictionary from snapshot value") 
         } 
        }) 
    } 
    

    ここでコンソール・ログです。
    プリント(辞書)

  2. 'test13' は 'ゼロ' は
    プリント(dictの[ "\(QRコード)"])

  3. から来た
    プリント(QRコード)

  4. から来ました

このコードは昨日から動作していましたが、今日は失敗しています。

私を助けてください!

編集:これは私が読もうとしているデータです。

enter image description here

ここでJSONファイルも同様ですJSON FILE

アップデート:私はここでの問題を発見したように見えます。

このコードを実行すると、何も印刷されません。

if let newDict = dict[qrCode] as? NSDictionary { 
    print(newDict) 
} 

しかし、これを行うと、dictにアクセスできます。 QRコード値を有する文字列 "TEST10"

奇妙なASFあること

if let newDict = dict["test10"] as? NSDictionary { 
    print(newDict) 
} 

注意!それの背後にある理由とこれを修正する方法はまだ分かりません。

+0

ログのどの行がどのコードから来るのか分かりません。 –

+0

@FrankvanPuffelenが –

+0

に更新されましたあなたの質問にJSONツリーの画像が含まれています。実際のJSONをテキストとして置き換えてください。このテキストは[Firebaseデータベースコンソール](https://console.firebase.google.com/project/_/database/data/)の[Export JSON]リンクをクリックすることで簡単に取得できます。 。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

答えて

0

コードは印刷する必要がありますが、とにかく悪い方法です。あなたはデータベースからクライアントにすべてのQRコードをダウンロードして、その中の1つが存在するかどうかを確認します。データベースに格納されるデータが多いほど、チェックごとにダウンロードするデータが増えます。データベース内の1レベル下のオブザーバーを接続するためにはるかに効率的です:

func checkForDuplicateScan(qrCode: String) { 
    DataService.ds.REF_SAMPLES.child(qrCode).observeSingleEvent(of: .value, with: { (snapshot) in 
    if snapshot.exists() { 
     if let sampleDict = snapshot.value as? [String:Any] { 
      if let isScanned = sampleDict["scanned"] as? Bool { 
       if isScanned == true { 
+0

オプション() これは私が手に入れたものです –

+0

ええ、何かが欠けているようです。別のアプローチを試してみましょう。私はこれを行うより効率的な方法を示すために私の答えを更新しました。 –

+0

まだ動作しません。それがうまくいかない理由を考えることはできません。 :| –

1

チェックするだけで何か、あなたの問題はFirebaseデータとデータタイプとないとのようです。したがって、「エラー:無効なコードがスキャンされました」というメッセージが表示されます。 私はいつものようなもので行く:

if let value = snapshot.value as? NSDictionary { 
    let username = value?["username"] as? String ?? "" 
    etc ... 
} 

[文字列:任意]は、過去に私のために問題を引き起こしています。とにかく、読んでいるデータのサンプルを提供すると便利です。

+0

これはうまくいかなかった。私は質問を更新しました。 –

+0

私を許しても、私はまだqrCodeがどこから来ているのか混乱しています。 JSONの例では表示されません。私はそれがあなたに頭痛を与えているqrCodeだと思う。 – TheeBen

+0

'test9'、 'test10'、 'test11'などはqrCodeの値です –

関連する問題