【问题标题】:Android - Firebase query startAt not working as expectedAndroid - Firebase 查询 startAt 未按预期工作
【发布时间】:2016-10-14 09:07:54
【问题描述】:

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

这是数据集

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 时,响应还包括test。 也许我做错了什么,或者我走错了路。 谁能指出我正确的方向。

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

谢谢

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    当您调用orderByChild("name").startAt("abc") 时,数据库按名称属性对所有项目进行排序,跳过abc 之前的项目,然后将它们全部返回。

    如果您只想返回与abc 匹配的子项,您可以使用equalTo()

    query = firebase.child(Constants.KEY_ITEM_NAME).orderByChild("name").equalTo("abc");
    

    【讨论】:

    • 感谢您的回复,是的,我使用了 equalTo() 但我正在尝试在 AutoCompleteTextView 中使用此查询,如果我有更多项目,可以说名称是 abc ,@ 987654328@,abe,我想搜索所有以ab开头的记录。我怎样才能做到这一点?
    • 我什至尝试过使用这种方式firebase.child("itemname").orderByKey().startAt("a").endAt("a\uf8ff"); 但没有响应。
    • 使用时有效.orderByChild("name").startAt("ab").endAt("ab\uf8ff");
    • 很高兴听到您如何解决它。我已经记下我们需要将该示例重新添加到文档的 firebase.google.com 版本中。
    • 是的,这是可行的,但它本身并没有找到“ab”。那么如何获得以“ab”开头并且也匹配/等于“ab”的每个值呢?
    【解决方案2】:

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

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

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

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

    祝你好运!

    【讨论】:

      【解决方案3】:

      为我工作:

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

      【讨论】:

        【解决方案4】:

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

         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.

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2019-08-15
            • 1970-01-01
            • 1970-01-01
            • 2012-11-13
            • 2021-07-15
            • 2017-06-24
            • 1970-01-01
            • 2015-09-05
            • 1970-01-01
            相关资源
            最近更新 更多