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()
,但它们都显示了完全相同的问题/结果任何关于如何按照
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
}