假设我有这样的结构:
-users
  -user1_uid
    name
    distance
    age

我如何进行查询(查找距离<100且年龄介于20到25之间的用户)? 我试过标准方法

let recentPostsQuery = (ref?.child("users").queryOrderedByChild("age").queryStartingAtValue("20"))!

问题是,这似乎不可能查询多个孩子(如结合年龄和距离过滤).几个月前与Firebase相比,这方面有什么变化吗?我相信,在第一次查询后在本地过滤它们不是一种选择,因为可能存在数千个对象.

我的第一选择是查询20到25之间的所有用户,然后在代码中过滤距离<1的用户. 100. 问题表明,代码中的过滤不是一种选择,但我想将其包含在完全适用于数千个节点或更少节点的情况中:
struct User { //starting with a structure to hold user data
        var firebaseKey : String?
        var theAge: Int?
        var thedistance: Int?
    }

    var userArray = [User]() //the array of user structures

    usersRef.queryOrderedByChild("age").queryStartingAtValue(20)
     .queryEndingAtValue(25).observeEventType(.Value,withBlock: { snapshot in

        for child in snapshot.children { //.Value so iterate over nodes

            let age = child.value["age"] as! Int
            let distance = child.value["distance"] as! Int
            let fbKey = child.key!

            let u = User(firebaseKey: fbKey,theAge: age,thedistance: distance)

            userArray.append(u) //add the user struct to the array
        }

        //the array to contain the filtered users
        var filteredArray: [User] = []
        filteredArray = userArray.filter({$0.thedistance < 100}) //Filter it,baby!

        //print out the resulting users as a test.
        for aUser in filteredArray {

            let k = aUser.firebaseKey
            let a = aUser.theAge
            let d = aUser.thedistance

            print("array: \(k!)  \(a!)  \(d!)")

        }

    })
}

现在一个潜在的超简单答案.

let usersRef = self.myRootRef.childByAppendingPath("users")

    usersRef.queryOrderedByChild("age").queryStartingAtValue(20)
     .queryEndingAtValue(25).observeEventType(.ChildAdded,withBlock: { snapshot in

        let distance = snapshot.value["distance"] as! Int

        if distance < 100 {
            let age = snapshot.value["age"] as! Int
            let fbKey = snapshot.key!

            print("array: \(fbKey)  \(age)  \(distance)")
        }
    })

请注意,我们正在利用.ChildAdded而不是.Value,因此每次读取一个节点 – 如果距离不是我们想要的,我们可以忽略它并继续下一个节点.

swift – Firebase查询的更多相关文章

  1. 如何使用Firebase在iOS上验证用户的电子邮件地址?

    我坚持使用firebase进行电子邮件验证.我四处寻找指导但没有帮助.在用户验证他的电子邮件后,我的代码仍然打印出用户尚未验证.我还在尝试习惯firebase的语法.这是我的代码:这是我注册部分的代码:解决方法您在签名之前检查了用户电子邮件是否已经过验证.这对我有用.

  2. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  3. ios – Swift Firebase安全无法正常工作

    正如@M_G建议的那样,我从父母和.read中取出了.write.所以我的规则现在是:我现在得到这个输出:解决方法Firebase文档错误(暂时).在Firebase控制台中,打开规则模拟器.目前没有“密码”选项,我认为这是一个错误.如果您没有使用多个身份验证或多个身份验证在您的项目中无关紧要,请不要在您的规则中使用提供程序.否则,您可以测试此规则以进行密码验证:

  4. ios – Firebase:我应该将GoogleService-Info.plist添加到.gitignore吗?

    我正在将Firebase用于我想要开源的iOS项目.我上传之前是否应该将GoogleService-Info.plist添加到.gitignore我在Github上共享项目?我知道它包含我的API密钥,客户端ID等,这可能不安全公开?

  5. ios – Firebase动态链接中的customURLScheme是什么?

    在documentation中它说要将以下行添加到我的AppDelegate.swift:根据我的理解,这应该是您在info.plist中添加的相同链接.但是,我很困惑为什么在quickstart-iosrepo他们决定将其等同于“dlscheme”.任何人都可以帮我理解这个方案究竟是什么?

  6. FIrebase iOS集成崩溃 – 由无效的GOOGLE_APP_ID引起

    我正在尝试使用Xcode构建集成Firebase来构建我的Cordova应用程序,但是我得到了这个模糊的错误,我无法理解什么是错的.我已将GoogleService-Info.plist文件放在项目目录中,但仍无法构建.这是堆栈跟踪可能是什么问题,我不知道还有什么需要展示,所以请问.解决方法出于某种原因,Xcode始终忽略位于项目根目录中的GoogleService-Info.plist,并且未将其复制到项目的Resources文件夹中.我在那里手动复制文件,然后编译应用程序并运行得很好.

  7. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  8. ios – Firebase Swift – 如何创建子项并将其id添加到另一个ref属性?

    如here所述,我想将Book对象存储在单独的ref中,并将其id值存储在User的books属性中每当我在应用程序中添加一本书时book对象是在Booksref中创建的,但我想立即将其id添加到User的用户书籍数组中.可以用一些漂亮的方式完成,而不是查询书籍,检索它的ID并将其添加到数组中吗?如果不是,查询刚刚创建的对象id的正确方法是什么?也许我不应该使用AutoId模式并在应用程序中为自己创建每个对象的唯一ID?解决方法您可以通过以下方式获取childByAutoId创建的密钥:

  9. ios – 默认应用尚未配置

    我试图将我的应用程序升级到新版本的Firebase.我浏览了设置指南,并编辑了我的所有代码以匹配新的语法.但是,当我运行应用程序时,我会收到这两个错误.我在AppDelegate中有FIRApp.configure(),并将GoogleServices-Info.plist导入到我的项目中.plist也有所有正确的信息.任何人遇到这个或知道如何解决它?

  10. ios – Firebase – 删除和重新安装应用程序不会取消对用户进行身份验证

    在使用以下代码验证用户之后….如果您随后删除该应用程序并将其重新安装在同一台设备上,则该调用将始终返回他们登录.这是为什么?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部