如何实现sqlite"喜欢"在android firebase-database中查询

时间:2017-07-06 07:54:43

标签: android firebase firebase-realtime-database

我正在尝试在firebase数据库中实现sqlite like查询。对于例如如果有10个条目abc1,abc2,abc3,..... abc10。使用abc+"%"的查询应显示所有10个条目。我尝试了orderByChild("").equalTo("")以及startAt(""),但没有得到理想的结果。

尝试this链接,但仍然卡住了。请建议。

2 个答案:

答案 0 :(得分:0)

使用endAt(" abc9")的

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();
}