【问题标题】:Unable to retrieve data from JSON in Firebase Database Swift无法从 Firebase 数据库 Swift 中的 JSON 检索数据
【发布时间】:2017-06-24 06:39:01
【问题描述】:

我冒险将 Firebase 用于我的最终项目。我无法从 Firebase 数据库中检索我的数据。我不知道我错在哪里。请赐教。

主文件:

var ref: FIRDatabaseReference!
let user = FIRAuth.auth()?.currentUser

@IBOutlet var placename: UILabel!
@IBOutlet var placetype: UILabel!

var SiasuObj = [siasuObj]()
var PlaceObj = [placeObj]()

var planPriceLevel = ""

override func viewDidLoad() {
    super.viewDidLoad()

    fetchData()

    findPlaceToEat()
}

func fetchData(){

    //var planPriceLevel = ""
    ref = FIRDatabase.database().reference()

    //I can't pass through this part

ref.child("ios_entry").child(user!.uid).child("Budget").observeEventType(.ChildAdded, withBlock: {
        (snapshot) in

        if let dictionary = snapshot.value as? [String: AnyObject]{
            let SiasuObj = siasuObj()
            SiasuObj.setValuesForKeysWithDictionary(dictionary)
            self.SiasuObj.append(SiasuObj)
            print("Total budget")
            print(SiasuObj.total_budget, SiasuObj.total_day, SiasuObj.total_pax)
            SiasuObj.total_budget = dictionary ["total_budget"] as! String
            SiasuObj.total_day = dictionary["total_day"] as! String
            SiasuObj.total_pax = dictionary["total_pax"] as! String

            let  total_budget:Int32? = Int32(SiasuObj.total_budget);
            print(total_budget)
            let total_day:Int32? = Int32(SiasuObj.total_day);
            print(total_day)
            let total_pax:Int32? = Int32(SiasuObj.total_pax);
            print(total_pax)

            let budgetPerPax = (total_budget! / total_pax!) / (total_day! * 3);

            if(budgetPerPax < 50){
                self.planPriceLevel = "1";
                self.findPlaceToEat();
            }else if(budgetPerPax <= 150){
                self.planPriceLevel = "2";
                self.findPlaceToEat();
            }else if(budgetPerPax > 150){
                self.planPriceLevel = "3";
                self.findPlaceToEat();
            }
        }

        }, withCancelBlock: nil)
}

func findPlaceToEat(){
    print("inside findPlaceToEat()")

    print("Plan price level")
    print(planPriceLevel)
    //let pricelevel = String(planPriceLevel)
   // print("pricelevel")
    //print(pricelevel)

    ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.ChildAdded, withBlock:{
        (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]{
            let PlaceObj = placeObj()
            //placeObj.setValuesForKeysWithDictionary(dictionary)

            //self.PlaceObj.append(PlaceObj)
            print("Whatever")
            print(PlaceObj.place_name, PlaceObj.place_type)
            PlaceObj.place_name = dictionary["place_name"] as! String
            PlaceObj.place_type = dictionary["place_type"] as! String
            PlaceObj.price_range = dictionary["price_range"] as! String
            PlaceObj.vegan_type = dictionary["vegan_type"] as! String
            PlaceObj.website = dictionary["website"] as! String



            self.placename.text = PlaceObj.place_name;


        }
    }, withCancelBlock: nil)
}

类文件:

class placeObj: NSObject {

var place_name : String!
var place_type : String!
var price_range : String!
var vegan_type : String!
var website : String!
}

【问题讨论】:

  • 你能发布你的firebase结构吗?

标签: ios json swift firebase firebase-realtime-database


【解决方案1】:

不要使用.observeEventType(.ChildAdded),而是使用.value,因为添加的子元素只会在新条目添加到firebase时获取数据。

要读取路径上的数据并监听变化,请使用FIRDatabaseReferenceobserveEventType:withBlockobserveSingleEventOfType:withBlock 方法来观察FIRDataEventTypeValue 事件。

FIRDataEventTypeValue:读取并监听路径全部内容的变化。

Firebase 文档 说:您可以使用FIRDataEventTypeValue 事件来读取给定路径的数据,因为它 事件发生时存在。该方法在何时触发一次 每次数据时都会附加侦听器,包括任何 孩子们,变化。事件回调传递了一个快照,其中包含 该位置的所有数据,包括子数据。如果没有数据, 返回的快照的值为 nil。

【讨论】:

    【解决方案2】:

    改变这一行

    ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.ChildAdded, withBlock:{
        (snapshot) in
    

    到这里:

    ref.child("places_detail").child("price_level").child(planPriceLevel).childByAutoId().observeEventType(.Value, withBlock:{
        (snapshot) in
    

    ObserveEvent 类型为 .ChildAdded 仅在添加新孩子时为您提供信息。这就是为什么使用 .Value

    要检查的更重要的一点是参考 URL。检查您在 Google-Info.plist 中的基本 URL 是否正确

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多