我正在尝试在firebase数据库中实现sqlite
like
查询。对于例如如果有10个条目abc1,abc2,abc3,..... abc10。使用abc+"%"
的查询应显示所有10个条目。我尝试了orderByChild("").equalTo("")
以及startAt("")
,但没有得到理想的结果。
尝试this链接,但仍然卡住了。请建议。
答案 0 :(得分:0)
startAt(" abc1")将适用于前九个。
然而,字符串排序明智,abc10将抛弃排序abc1,abc10,abc2
所以...如果你知道有多少abc的上限,你可以用零填充来获得所需的输出。在这里,我们知道我们将限制在999。
{{1}}
然后startAt和endAt将正常工作。
或者,您可以将整数值存储在另一个子节点中,并按数字顺序排序。
答案 1 :(得分:0)
在阅读了很多问题后,我很失望地发现firebase没有实现sqlite“like”查询,所以我决定解决它。
我知道这个问题已经过时了,但是如果有人仍在努力寻找这个问题的答案,我找到了另一种解决方案,一种更精确的解决方法。
当应用程序启动时,将列表存储在内存中并将其作为原始数据保存,以便每次需要时从列表中进行查询,列表仍将与firebase同步。我是如何做到的。
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Loading data from firebase to the temporary listItem data
ArrayList<ListItem> data = new ArrayList<>();
for(DataSnapshot customList : dataSnapshot.getChildren()){
ListItem item = customList.getValue(ListItem.class);
data.add(item);
}
listData.clear();
listData.addAll(data);
//listData above is my list that i use and re-use (clear and refull, rawListData is like my offline firebase database)
rawListData = new ArrayList<>();
rawListData.addAll(data);
if(firstRun){
firstRun=false;
myAdapter = new MyAdapter(MainActivity.this, listData);
recView.setAdapter(myAdapter);
if(!isBind){
runService();
}
}else{
myAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "Database loading error", Toast.LENGTH_SHORT).show();
}
});
让我们说我想在我的数据中搜索一个包含单词&#34; blues&#34;在它..我只是称这个线程&gt; filterMusicType(&#34;蓝色&#34);
public void filterMusicType(String type){
//Notify RecyclerView that listData was cleared.
int currentSize = listData.size();
listData.clear();
myAdapter.notifyItemRangeRemoved(0, currentSize);
//Filter data based on music type
for(ListItem item : rawListData){
String station = item.getTitle().toLowerCase();
if(station.contains(type)){
listData.add(item);
}
}
//Notify RecyclerView that listData was laoded with new Data.
myAdapter.notifyItemRangeInserted(0, listData.size());
myAdapter.notifyDataSetChanged();
}