当前位置: 首页 > 面试题库 >

Swift-数据库中的Firebase搜索

逄边浩
2023-03-14
问题内容

我在输入时搜索用户。但是最后它返回了每个用户。我不知道为什么会这样。好像还好

 class func findUsers(text: String)->[User]{
    let user = User()
    var users = [User]()
    ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).observeEventType(.Value, withBlock: { snapshot in
        for u in snapshot.children{
            user.name = u.value!["name"] as? String
            user.surname = u.value!["surname"] as? String
            user.email = u.value!["email"] as? String
            user.score = u.value!["score"] as? Int
            user.status = u.value!["status"] as? Int
            user.id = u.value!["id"] as? String
            user.pin = u.value!["pin"] as? String
            users.append(user)
            print(user.name)
        }
    })
    print("users:", users)
    return users
}

问题答案:

您正在使用queryStartingAtValue。从文档中:

FIRDatabaseQuery返回的实例
queryStartingAtValue:childKey将响应节点上具有大于startValue或等于startValue且键大于或等于childKey的值的事件。

因此请记住,如果您搜索name某个用户的,则会为所有名称按字母顺序大于给定名称的用户提供。您需要设置a
queryEndingAtValue以限制查询范围。

ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).queryEndingAtValue(text+"\u{f8ff}")

Firebase旧版文档是了解Firebase如何处理查询的好资源。在那里您会发现:

上面查询中使用的f8ff字符在Unicode范围内是一个很高的代码点。因为它在Unicode中大多数常规字符之后,所以该查询匹配所有以b开头的值。

您可能还会对Elasticsearch感兴趣。Flashlight是一个将Elasticsearch和Firebase集成在一起的节点服务。

更新:

如注释所指出的, 如果您搜索的字符串有大写字符,将无效 。在这种情况下,解决方案在对象中 有一个
附加字段,其中要搜索的信息全部用小写字母表示 。因此,如果有的话Satoshi Nakamotoname您可以使用保存其他nameSearch属性satoshi nakamoto

最后确保您的搜索字符串也使用小写字母。

您的代码还有其他一些问题。

  • 您正在设置观察者。每当您的数据更改时,它都会触发回调,因此您应该users在回调中重置数组,以确保没有重复和脏数据。

  • 由于Firebase调用是异步的,因此您的函数不会向用户返回数据。通话return users时,不会填充用户数组。我建议您使用self.users = users而不是在函数中返回它。否则,如果要继续使用当前方法并将其返回,则应设置完成处理程序。

class func findUsers(text: String)->Void{
    ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).queryEndingAtValue(text+"\u{f8ff}").observeEventType(.Value, withBlock: { snapshot in
        var user = User()
        var users = [User]()
        for u in snapshot.children{
            user.name = u.value!["name"] as? String
            ...
            users.append(user)
        }
        self.users = users
    })
}


 类似资料:
  • 查看其他关于堆栈溢出的问题,有人说这可能是因为valueEventListener的位置不正确,但...不是吗?我正在钻进食物条目/营养条目,但我不知道如何钻进更深。没办法匿名给孩子打电话?我尝试调用childEventListener而不是valueEventListener,其他的都一样,但我再也没有得到那个消息,但我仍然无法检索到我想要的数据。 编辑: 谢谢你到目前为止的帮助。根据下面Has

  • 问题内容: Firebase数据库中的以下数据: 我想检索所有仅活动为true的Weeks。我正在这样设置Firebase参考: 然后执行以下操作: 产生以下输出: 有人可以建议我怎样才能将active设置为true的那几周需要加载到string类型的数组中: 问题答案: 为此,您可以使用并喜欢这样。

  • 问题内容: 我的数据库具有按以下方式排序的值: 我想实现一个朋友添加系统,您可以在其中搜索用户名或电子邮件,并允许您添加此人。 我可以通过使用找到用户 这样我就可以得到用户的整个字典,但是在获取UID时遇到了问题。 snapshot.key给了我“用户”。 使用用户名/电子邮件找到用户的字典后,如何从字典中获取UID值? 问题答案: 对Firebase数据库执行查询时,可能会有多个结果。因此,快照

  • 一切正常,但DatabaseReference无法获取数据,这就像是忽略了我的代码运行,就像我的internet无法运行一样,请帮助我,我是这个社区的新手,下面是我的代码和图片。 以前它是工作的,但由于我只是更改了一些代码,使只有currentVersion>=vCode,这样即使数据库中的值是 firebase数据库映像 mainactivity.java manifest.xml 依赖关系

  • 我正在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList保存在Firebase数据库中。但我在取回航路点时遇到了问题。我是这样插入的: 在检索数据时,我尝试执行以下操作:

  • 我在XCode中编写了一个方法,在firebase实时数据库中保存“用户”。不幸的是,数据没有显示在我的浏览器中的实时数据库中,尽管我通过内置的打印命令从Xcode得到了反馈,一切都很顺利。有人知道吗?我真的很高兴听到你的消息。最美好的祝福 PS:是的:读取和写入在我的数据库规则中被激活。