Firebase查询即使存在数据也返回null

时间:2019-01-24 02:00:00

标签: swift firebase firebase-realtime-database

所以我有一个查询设置,它将查询用户输入的年龄在数据库中的位置。由于某些原因,即使年龄在我的数据库中,它仍将返回null。

如果我输入35作为年龄,即使35是数据库中的年龄之一,它仍然会打印“ NULL”。我该如何解决?

enter image description here Json文件:

  {
  "data" : [ {
    "age" : 35,
    "agratio" : 0.9,
    "alb" : 3.3,
    "alkphos" : 187,
    "db" : 0.1,
    "diagonsis" : "yes",
    "gender" : 1,
    "sgot" : 18,
    "sgpt" : 16,
    "tb" : 0.7,
    "tp" : 6.8
  }, {
    "age" : 40,
    "agratio" : 0.9,
    "alb" : 3.3,
    "alkphos" : 187,
    "db" : 0.1,
    "diagonsis" : "no",
    "gender" : 1,
    "sgot" : 18,
    "sgpt" : 16,
    "tb" : 0.7,
    "tp" : 6.8
  } ],
  "users" : {
    "234234adfsdsf" : {
      "username" : "hey"
    },
    "BbZZCTIIcJdvCCU9og905kKVvo53" : {
      "email" : "andy55@yahoo.com",
      "username" : "andy"
    }
  }
}

代码:

@IBAction func onDiagnose(_ sender: Any) {
        let ref = Database.database().reference(fromURL: "https://agetest.firebaseio.com/")
        let databaseRef = ref.child("data")
        databaseRef.queryOrdered(byChild: "age").queryEqual(toValue: String(ageTextField.text!)).observeSingleEvent(of: .value, with: { (snapshot) in
            // if there is data in the snapshot reject the registration else allow it

            if (snapshot.value! is NSNull) {


               print("NULL")

            } else {
                print(snapshot.ref.parent?.key!)
                //get parent

            }


        }) { (error) in
            print(error.localizedDescription)
        }

    }

2 个答案:

答案 0 :(得分:0)

根据我使用Fiebase Realtime数据库的经验,它不会像在JSON文件中那样容纳对象数组。我不得不将其简单地格式化为没有任何数组的嵌套对象。更像是:

"data" : {
 <someRandomKey1> : {
    "age" : 35,
    "agratio" : 0.9,
    "alb" : 3.3,
    "alkphos" : 187,
    "db" : 0.1,
    "diagonsis" : "yes",
    "gender" : 1,
    "sgot" : 18,
    "sgpt" : 16,
    "tb" : 0.7,
    "tp" : 6.8
  }, 
<someRandomKey2> : {
    "age" : 40,
    "agratio" : 0.9,
    "alb" : 3.3,
    "alkphos" : 187,
    "db" : 0.1,
    "diagonsis" : "no",
    "gender" : 1,
    "sgot" : 18,
    "sgpt" : 16,
    "tb" : 0.7,
    "tp" : 6.8
  } 
},

要确定这是否与您遇到的问题有关,您可能需要进入Firebase控制台,并通过Web界面查看实时数据库中的数据,以查看它是否在保存方式你期望与否。

答案 1 :(得分:0)

您正在将一个字符串(在您的代码中)与一个数据库中的一个数字进行比较,但两者并不相同。解决方案是先解析代码中的数字,然后再将其传递给queryEqual(toValue: )

databaseRef
  .queryOrdered(byChild: "age")
  .queryEqual(toValue: Int(ageTextField.text)!)
  .observeSingleEvent(of: .value, with: { (snapshot) in