Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FirebaseListAdapter忽略orderByChild()和equalTo()_Firebase_Firebase Realtime Database_Kotlin - Fatal编程技术网

FirebaseListAdapter忽略orderByChild()和equalTo()

FirebaseListAdapter忽略orderByChild()和equalTo(),firebase,firebase-realtime-database,kotlin,Firebase,Firebase Realtime Database,Kotlin,因此,我想制作一个FirebaseListAdapter,以便在用户键入至少X(在我的示例中为1)个字符后显示自动完成建议 以下是实时数据库中的数据: -myModels --0 ---name: "beef" --1 ---name: "vegetable" --2 ---name: "bean" { "rules": { "myModels": { ".indexOn": ["name"] }, } } 以下是上述数

因此,我想制作一个
FirebaseListAdapter
,以便在用户键入至少X(在我的示例中为1)个字符后显示自动完成建议

以下是实时数据库中的数据:

-myModels
--0
---name: "beef"
--1
---name: "vegetable"
--2
---name: "bean"
{
    "rules": {
        "myModels": {
            ".indexOn": ["name"]
        },
    }
}
以下是上述数据库的firebase索引规则:

-myModels
--0
---name: "beef"
--1
---name: "vegetable"
--2
---name: "bean"
{
    "rules": {
        "myModels": {
            ".indexOn": ["name"]
        },
    }
}
不知何故,在我输入>1个字符后,无论字符是什么,结果总是这样(按这个确切的顺序)

(我所说的“无所谓”,当然包括以下每一个字符串:“牛肉”、“蔬菜”或“豆子”(一次一个单词),甚至还有一个无意义的键盘组合,如“igivibbi”)

另外,我对一些代码进行了裁剪以缩短代码段,例如:

  • 每次键入后延迟显示建议,以防止过度呼叫
  • suggestionAdapter.cleanup()
    createNewsSuggestionautoComplete()
  • 附:其他详情

  • 我之所以使用
    MyModel
    而不仅仅是
    String
    ,是因为我还想添加一些其他字段
  • 在使用上述代码中的
    equalTo()
    之前,我也尝试了
    startAt()
    ,但它们都显示了完全相同的问题/结果
  • 顺便说一句,上面的代码是用Kotlin编写的。但我认为这不是问题的原因

  • 任何关于如何按照
    ref
    中指定的
    FirebaseQuery
    正确显示数据的建议

    都证明我错误地实现了
    FirebaseListAdapter

    我应该将
    Query
    而不是
    DatabaseReference
    传递给
    FirebaseListAdapter
    最后一个参数。(编辑器没有发现错误,因为
    DatabaseReference
    也继承自
    Query

    因此,它应该是:

    fun createNewSuggestionAutoComplete(query: String) {
        val q = FirebaseDatabase.getInstance().getReference("myModels")
                .orderByChild("name").equalTo(query)
        suggestionAdapter = FirebaseSuggestionAdapter(q)
        ...
        mSearchSuggestionsListView.adapter = suggestionAdapter
        ...
    }
    
    inner class FirebaseSuggestionAdapter(q: Query) :
            FirebaseListAdapter<MyModel>(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, q) {
        override fun populateView(v: View, model: MyModel, position: Int) {
            v.findViewById<TextView>(android.R.id.text1).text = model.name
    }
    
    fun CreateNewsSuggestionautoComplete(查询:字符串){
    val q=FirebaseDatabase.getInstance().getReference(“myModels”)
    .orderByChild(“名称”).equalTo(查询)
    SuggestionaAdapter=FirebaseSuggestionaAdapter(q)
    ...
    mseArchSuggestionListView.adapter=suggestionAdapter
    ...
    }
    内部类FirebaseSuggestionaAdapter(q:Query):
    FirebaseListAdapter(this@MainActivity,MyModel::class.java,android.R.layout.simple\u list\u item\u 1,q){
    覆盖趣味populateView(v:View,model:MyModel,position:Int){
    v、 findviewbyd(android.R.id.text1).text=model.name
    }
    
    不幸的是,Firebase中的
    startAt()
    不是
    startWith()
    ,因此当您输入
    bee
    时,它不会返回
    bee
    ,而是返回每个节点,从name=
    bee
    (确切地说是“bee”),直到最后一个节点(如果您没有指定
    endAt()

    如果它没有找到任何
    bee
    ,它将返回所有节点

    如果您想使用类似于
    startWith()
    ,不幸的是Firebase仍然不支持这种查询

    不过,有一个名为的库,它可能对您的案例有所帮助。它也是由firebaser编写的。(仅限JS)

    这也可能对你有所帮助

    fun createNewSuggestionAutoComplete(query: String) {
        val q = FirebaseDatabase.getInstance().getReference("myModels")
                .orderByChild("name").equalTo(query)
        suggestionAdapter = FirebaseSuggestionAdapter(q)
        ...
        mSearchSuggestionsListView.adapter = suggestionAdapter
        ...
    }
    
    inner class FirebaseSuggestionAdapter(q: Query) :
            FirebaseListAdapter<MyModel>(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, q) {
        override fun populateView(v: View, model: MyModel, position: Int) {
            v.findViewById<TextView>(android.R.id.text1).text = model.name
    }