2017-07-17 14 views
0

如何根據用戶名搜索用戶?我已經看了看這件事情​​無數SO職位,但我仍然無法達到我想要做的。我試圖運用我在那些帖子看到,如下所示:Firebase Android - startAt()和endAt()無法正常工作?

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users"); 
      usersRef.orderByChild("username") 
        .startAt(queryText) 
        .endAt(queryText+"\uf8ff"); 

      usersRef.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
        searchList = new ArrayList<>(); 
        for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
         User user = postSnapshot.getValue(User.class); 
         Log.d("USER: ", "" + user.getUsername()); 

         searchList.add(user); 
        } 

        adapter = new UserCardAdapter(getContext(), searchList); 
        recyclerView.setAdapter(adapter); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.e("onQueryTextChange: " ,databaseError.getMessage()); 
       } 
      }); 

但是,所有用戶仍然被檢索。我見過startAt()和ENDAT(的使用),爲他人在其他職位按說工作,但我不能設法得到它的工作對我來說..

這是用戶數據的存儲方式: User Data Structure

+0

你正在使用什麼'queryText'?如果你使用'.equalTo(「fakeuser3」)而不是'startAt()'和'endAt()',會發生什麼? – weibeld

+0

queryText是從「搜索欄」輸入的文本。嘗試使用.equalsTo()會再次返回所有用戶:(我開始懷疑我是否使用了正確的聽衆.. –

+0

賓果!請參閱我的答案。 – weibeld

回答

1

你幾乎做對了,但你應該已經應用數據庫引用後添加addListenerForSingleValueEventorderBy()startAt()endAt()這樣。

usersRef.orderByChild("username") 
         .startAt(queryText) 
         .endAt(queryText+"\uf8ff") 
         .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 
        searchList = new ArrayList<>(); 
        for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
         User user = postSnapshot.getValue(User.class); 
         Log.d("USER: ", "" + user.getUsername()); 

         searchList.add(user); 
        } 

        adapter = new UserCardAdapter(getContext(), searchList); 
        recyclerView.setAdapter(adapter); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.e("onQueryTextChange: " ,databaseError.getMessage()); 
       } 
      }); 
+0

OMG THANK YOU!爲什麼如果我分別執行userRef.orderby()。startAt()。endAt()和userRef.AddListener,會產生影響 –

+0

通過應用'orderBy()', 'startAt()','en dAt()',它不改變'userRef',但它返回'Query'對象的實例。查看Firebase文檔以獲得更多詳細信息:) –

+0

哦,我明白了,非常感謝你! –

0

根據documentation,您使用orderBy(),startAt()endAt()是正確的。

addListener方法必須的,而不是在上DatabaseReference一個新的語句與... .getReference("users")檢索直接應用於通過的orderByChild()startAt(),和endAt()方法鏈返回的對象。

如果使用ChildEventListener

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users"); 
usersRef.orderByChild("username") 
     .startAt(queryText) 
     .endAt(queryText+"\uf8ff"); 
     .addChildEventListener(new ChildEventListener() { 
      List<User> searchList = new ArrayList<>(); 

      @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      User user = dataSnapshot.getValue(User.class); 
      Log.d("USER: ", "" + user.getUsername()); 
      searchList.add(user); 
      } 

      @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) {} 
      @Override public void onChildRemoved(DataSnapshot dataSnapshot) {} 
      @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 
      @Override public void onCancelled(DatabaseError databaseError) {} 
    }); 
+0

感謝您的回覆!讓我試試這個(: –

+0

好吧我改變了監聽器,並在搜索欄中輸入f確實使queryText =「f」,但日誌仍然打印出db中的所有用戶:(並且只有三個用戶的用戶名以f開頭:( –

+0

是,清楚的是,'orderByChild()'等並沒有像Boonya Kitpitak的回答中指出的那樣起作用。您將'addListenerForSingleValueEvent()'直接應用到'getReference(「users」)''返回的'DatabaseReference'。 – weibeld