FirebaseListAdapter忽略orderByChild()和equalTo()

时间:2017-06-30 15:12:32

标签: firebase firebase-realtime-database kotlin

所以,我想让FirebaseListAdapter显示自动完成建议,因为在用户输入至少X(在我的情况下为1)个字符后。

val mSearchSuggestionsListView = findViewById(R.id.main_list_view) as ListView
var suggestionAdapter: FirebaseSuggestionAdapter? = null

mSearchEditText.editText.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(editable: Editable) {
        if (editable.length > 1) {
            ...
            createNewSuggestionAutoComplete(editable.toString().toLowerCase())
            ...
        } else {
            mSearchSuggestionsListView.adapter = null
        }
    }
    ...
    //Other overrides trimmed 
})


fun createNewSuggestionAutoComplete(query: String) {
    val ref = FirebaseDatabase.getInstance().getReference("myModels")
            .orderByChild("name").equalTo(query).ref
    suggestionAdapter = FirebaseSuggestionAdapter(ref)
    ...
    mSearchSuggestionsListView.adapter = suggestionAdapter
    ...
}

inner class FirebaseSuggestionAdapter(ref: DatabaseReference) :
        FirebaseListAdapter<MyModel>(this@MainActivity, MyModel::class.java, android.R.layout.simple_list_item_1, ref) {
    override fun populateView(v: View, model: MyModel, position: Int) {
        v.findViewById<TextView>(android.R.id.text1).text = model.name
    }
}

这里是MyModel班级:

class MyModel(var name: String)

这是实时数据库中的数据:

-myModels
--0
---name: "beef"
--1
---name: "vegetable"
--2
---name: "bean"

这是以上数据库的firebase索引规则:

{
    "rules": {
        "myModels": {
            ".indexOn": ["name"]
        },
    }
}

不知何故,结果,我输入&gt; 1个字符,无论字符是什么,总是像这样(按照确切的顺序)。

beef
vegetable
bean

(我的意思是&#34;无论&#34;当然包括以下每一个字符串:&#34;牛肉&#34;,&#34;蔬菜&#34;或&#34; bean&#34;(一次1个单词),甚至是无意义的键盘组合,例如&#34; igiviibbi&#34;)

P.S还有一些我修剪过的代码以缩短代码段,例如:

  1. 每次打字后延迟显示建议以防止过度通话。
  2. suggestionAdapter.cleanup()createNewSuggestionAutoComplete()
  3. 开始创建新实例之前调用

    P.S.S其他细节。

    1. 我使用MyModel而不仅仅是String的原因是因为我还要添加其他字段。
    2. 我在上面的代码中使用startAt()之前尝试了equalTo(),但它们都显示/显示完全相同的问题/结果。
    3. 上面的代码是用Kotlin编写的。但我认为这不是造成这个问题的原因。
    4. 有关如何在FirebaseQuery中指定的ref正确显示数据的任何建议吗?

1 个答案:

答案 0 :(得分:0)

原来我错误地实施了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
}

不幸的是,Firebase中的startAt()不是startWith(),而是返回beef&amp; bean当您输入bee时,它会返回每个节点,从name = bee开始(确切地说是“bee”),直到最后一个节点(如果您不要指定endAt()

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

如果您想使用startWith()之类的内容,遗憾的是Firebase仍然不支持此类查询。

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

这也可能对您有所帮助Android - Firebase query startAt not working as expected