Android - Firebase查询startAt无法按预期工作

时间:2016-06-13 20:13:34

标签: android firebase firebase-realtime-database

我正在开发一个使用Firebase作为后端的Android应用。 我是Firebase的新手并且遇到了问题,问题是当我尝试使用NOT IN查询搜索记录时,它会返回不以我输入的关键字开头的结果。

这是数据集

startAt

这是代码snippit

itemname
    -KK8vI8A5BZZp3Xo3FpA
       name: "abc"
    -KK8w3uoJdJ0hBSrq0CS
       name: "test"
    -KKAC1o9Vazyg9JLtDoQ
       name: "dude"

因此,当我搜索Query query = firebase.child(Constants.KEY_ITEM_NAME).orderByChild("name").startAt("abc"); query.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Iterator<DataSnapshot> i = dataSnapshot.getChildren().iterator(); while (i.hasNext()) { DataSnapshot d = i.next(); LOG(d.getKey(), d.getValue().toString()); } } 时,回复中还包含abc。 也许我做错了什么或者我做错了路。 有谁能指出我正确的方向。

P.S我正在尝试使用test来搜索项目。

由于

5 个答案:

答案 0 :(得分:5)

当您致电$ git checkout --track newfeature fatal: Missing branch name; try -b $ git checkout newfeature error: pathspec 'newfeature' did not match any file(s) known to git. 时,数据库按名称属性对所有项目进行排序,跳过orderByChild("name").startAt("abc")之前的项目,然后将其全部返回。

如果您只想找回与abc匹配的孩子,则您使用abc

equalTo()

答案 1 :(得分:0)

不幸的是,你无法做你想做的事。我假设你要搜索的方法是startsWith()而不是startAt()(以匹配以子字符串开头的所有单词)。这个方法还没有在Firebase中实现,太糟糕了。

你必须使用像ElasticSearch这样的外部服务,但这意味着你必须拥有一台服务器,这可能是你实际使用firebase的原因之一......无论如何,这是一个实现ElasticSearch的链接:

https://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html

否则你将不得不弄清楚如何摆脱你的搜索栏......

祝你好运!

答案 2 :(得分:0)

为我工作:

        Query query = MyApplication.sReferenceOrders.orderByChild(Constants.STATUS).startAt("1").endAt("1\\uf8ff");

答案 3 :(得分:0)

我认为您正在尝试为您的应用实施搜索功能.. 这是我的查询

 private void searchForMatch(String keyword) {
    Log.d(TAG, "SearchForMatch: searching for match");
    mUserList.clear();
    if (keyword == null) {
        mUserList.clear();
    } else {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        Query query = reference.child("where you want to search in database ")
                .orderByChild("what do you want search from your database").startAt(keyword).endAt(keyword + "\uf8ff");
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot singlesnapshot : dataSnapshot.getChildren()) {
                    Log.d(TAG, "onDataChange: found user" + singlesnapshot.getValue(User.class).toString());
                    mUserList.add(singlesnapshot.getValue(User.class));
                   this is my list adapter for displaying search results // updateUsersList();


                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }


}

如果您不知道它是如何运作的,请查看this tutorial on youtube.

答案 4 :(得分:-1)

我也在寻找这个解决方案,谢谢。 我尝试过,甚至可以使用它:

startAt('ab').endAt('ab\w|\W');