简体   繁体   English

快速如何从Firebase数据库进行搜索

[英]swift how to make a search from firebase database

I have a firebase database in my app, here is a screenshot of it: 我的应用程序中有一个Firebase数据库,这是它的屏幕截图: 在此处输入图片说明 And I need to filter my results using this controller 我需要使用此控制器过滤结果

调节器

so I need to compare from 所以我需要从

`ref.observe(.value, with: {snapshot in
            if (snapshot.value is NSNull){
                print("not found")
            }else{
                for child in (snapshot.children) {
                    let snap = child as! DataSnapshot
                    let dict = snap.value as! AnyObject
                    let latt = dict["lat"]
                    let lngt = dict["lng"]
                    let sext = dict["sex"]
                    let statust = dict["status"]
                    let aget = dict["age"]


                    if self.searchSex.selectedSegmentIndex == 0{
                        self.sexG = "Male"}
                    else if self.searchSex.selectedSegmentIndex == 1{
                        self.sexG = "Female"
                    }


                    if (self.sexG == sext as! String && Int(searchAgeFrom.value) <= Int(aget) <= Int(searchAgeTo.value)))
                    {


                    }


                }


            }

        })
`

I don't know how to filter results from dataSnapshot, I always get an errors. 我不知道如何从dataSnapshot过滤结果,我总是会遇到错误。 Here, I perform my searching, in ????? 在这里,我以?????进行搜索。 I don't know how search for selected value from pickerView: 我不知道如何从pickerView搜索选定的值:

 if (self.sexG == sext as! String && Int(searchAgeFrom.value) <= Int(aget) <= Int(searchAgeTo.value)) && ?????)
                {


                }

First of all your if condition is not correct as of with searchAgeTo.value you are not comparing with any value also instead of casting snap.value to AnyObject cast it to proper dictionary in your case it is [String:Any] . 首先,如果条件与searchAgeTo.value一样不正确, searchAgeTo.value您也不会与任何值进行比较,而不是将snap.value强制snap.valueAnyObject ,如果是[String:Any]AnyObject其强制snap.value为适当的字典。

Now to get the pickerView selected value you can use instance method selectedRow(inComponent:) or also use UIPickerViewDelegate method didSelectRow . 现在,要获取pickerView选定的值,您可以使用实例方法selectedRow(inComponent:)或也可以使用UIPickerViewDelegate方法didSelectRow

let selectedIndex = yourPickerView.selectedRow(inComponent: 0)
let selectedValue = yourPikcerArray[selectedIndex]

Now compare this in if condition this way. 现在,以这种方式在if条件中对此进行比较。

for child in (snapshot.children) {
    let snap = child as! DataSnapshot
    let dict = snap.value as! [String:Any]
    let latt = dict["lat"]
    let lngt = dict["lng"]
    let sext = dict["sex"] as! String
    let statust = dict["status"] as! String
    let aget = dict["age"]
    if self.searchSex.selectedSegmentIndex == 0 {
        self.sexG = "Male"
    }
    else {
        self.sexG = "Female"
    }
    let selectedIndex = yourPickerView.selectedRow(inComponent: 0)
    let selectedValue = yourPikcerArray[selectedIndex]
    if (self.sexG == sext && Int(searchAgeFrom.value) >= Int(aget) && Int(aget) <= Int(searchAgeTo.value) && selectedValue == statust) {
         //Handle here
    }
}

But instead of filtering Firebase data this way better way is you can store all the data in some main array and than filter that main array according to your filter so that you will not need to observe Firebase data every time when you change your filter value. 但是, Firebase这种更好的方式过滤Firebase数据,还不如将所有数据存储在某个主数组中,而不是根据过滤器对该主数组进行过滤,这样您就不必在每次更改过滤器值时都观察Firebase数据。 Also make one custom class or struct to manage all your Firebase data with array of that custom object. 还可以创建一个自定义类或结构,以使用该自定义对象的数组管理所有Firebase数据。

I believe you have erors in unwrapping of snapshot . 我相信您在解开snapshot会犯错误。

Try this: 尝试这个:

let dict = snap.value as! [String: AnyObject]
let latt = dict["lat"] as! Double
let lngt = dict["lng"] as! Double
// etc..

Hope it helps 希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM