2017-08-20 17 views
0

我已将Firebase链接到我的应用程序。当我试图从数据库读取数据时,数据出现在快照中。但是当读一个孩子时,它返回nil。Swift 3:FirebaseDB在儿童出现时返回零点

下面的代码:

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") 
     } 
    }) 
} 

这里的控制台日志:

Console log

日志:

  1. 字典来自印刷字典。
    打印(字典)

  2. 在 'test13' 从
    打印(QRCODE)

  3. 的 '零' 来自
    打印出来(字典[ “\(QRCODE)”])

此代码在昨天工作,但今天失败。

帮帮我!

编辑:这是我正在尝试阅读的数据。

enter image description here

这里的JSON文件以及JSON FILE

更新:看起来我已经在这里发现了这个问题。

当我运行这段代码时,什么都不打印。

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

但是,当我这样做时,字典是可访问的。

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

注意QRCODE是一个具有值串 “test10

奇怪ASF !!仍然无法弄清其背后的原因以及如何纠正这一问题。

+0

我不知道日志中的哪一行来自哪个代码。 –

+0

@FrankvanPuffelen已更新 –

+0

您在问题中包含了JSON树的图片。请用实际的JSON替换为文本,您可以通过单击[您的Firebase数据库控制台](https://console.firebase.google.com/project/_/database/data/)中的导出JSON链接轻松获取该文本。 。将JSON作为文本可以搜索,使我们能够轻松使用它来测试您的实际数据,并将其用于我们的答案中,并且通常只是一件好事。 –

回答

0

虽然代码应该打印,但它看起来像一个坏方法无论如何。您正在将数据库中的所有QR码下载到客户端,然后检查是否存在其中一个。数据库中的数据越多,每次支票下载的数据就越多。这是更有效的附加观察者低一个级别的数据库:

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

只是要检查一下,你的问题似乎是与数据类型,而不是与火力地堡数据。因此,你会得到“错误:无效代码扫描”。

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的值 –