【发布时间】:2016-09-27 02:05:10
【问题描述】:
我是 Firebase 和 NoSQL 的新手。我有一个 Android 演示,带有一个城市自动完成文本字段,我想在输入时从我的 Firebase 数据库中填充我拥有的城市。
{ "cities":{
"Guayaquil":true,
"Gualaceo":true,
"Quito":true,
"Quevedo":true,
"Cuenca":true,
"Loja":true,
"Ibarra":true,
"Manta":true
}
}
这是我目前所拥有的。
如何从以字母开头的数据库城市中检索(从键盘输入)?如果我开始输入“G”,我希望收到“Guayaquil”和“Gualaceo”。
如果我使用 orderByValue 总是返回一个空快照。
如果我使用orderByKey,则返回整个列表。
Query citiesQuery = databaseRef.child("cities").startAt(input).orderByValue();
citiesQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> cities = new ArrayList<String>();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
cities.add(postSnapshot.getValue().toString());
}
注意:如果您能推荐更好的数据结构,欢迎您。
【问题讨论】:
-
这个城市数据库有多大?您的应用程序是否可以将数据库一次读入本地副本(如某种数组),然后使用本地逻辑仅在键入时显示适当的值?
-
最初大约是 10,但可以增加到 100。我希望这个功能是“在线”的,所以我可以添加新城市而无需在本地存储它
-
哦,那很好。就处理器和网络而言,100个小字符串几乎没有,所以肯定会很快。让我澄清一下我将其存储在本地的意思。我的意思是在运行时内存中,仅此而已。我并不是说将副本存储在设备存储或类似的东西中。我的意思是,将城市读入一个数组,然后使用该数组来显示数据。当数据库更改时,您几乎可以立即轻松地更新数组,但我怀疑它会经常更改。查看我的答案,了解我在想什么。
-
作为额外说明,在我的回答中,您可以从该事件侦听器中取出“单一”一词,这将使其成为实时。然后只需在循环之前添加 cityList.clear() ,然后每当您的数据库更改时,您的整个数组列表都会被刷新。
标签: android firebase firebase-realtime-database nosql