Поиск в базе данных FirebaseDatabase для пользователей по имени пользователя

#java #android #firebase #firebase-realtime-database

#java #Android #firebase #firebase-база данных в реальном времени

Вопрос:

Я пытаюсь выполнить поиск пользователей, хранящихся в моей базе данных firebase, по имени пользователя с помощью простой панели поиска (EditText) и при нажатии кнопки для отображения этого конкретного пользователя

у меня есть следующий код в моих findfriends.java-файл

 public class FindFriendsActivity extends AppCompatActivity {

    private EditText seachTextBox;
    private ImageView searchImage;
    private RecyclerView searchResultList;
    private DatabaseReference allUsersDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find_friends);

        searchResultList = findViewById(R.id.search_result_list);
        searchResultList.setHasFixedSize(true);
        searchResultList.setLayoutManager(new LinearLayoutManager(this));

        allUsersDatabase = FirebaseDatabase.getInstance().getReference().child("users");

        seachTextBox = findViewById(R.id.searchBox);
        searchImage = findViewById(R.id.searchImage);

        searchImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String seachbox = seachTextBox.getText().toString();

               final Query searchpeople = allUsersDatabase.orderByChild("username").startAt(seachbox)
                        .endAt(seachbox   "uf8ff");
            }
        });

    }

    @Override
    protected void onStart()
    {
        super.onStart();

        FirebaseRecyclerOptions<FindFriends> options =
                new FirebaseRecyclerOptions.Builder<FindFriends>()
                .setQuery(allUsersDatabase, FindFriends.class)
                .build();

        FirebaseRecyclerAdapter<FindFriends, FindFriendsHolder> adapter =
                new FirebaseRecyclerAdapter<FindFriends, FindFriendsHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull FindFriendsHolder holder, int position, @NonNull FindFriends model)
                    {
                        holder.username.setText(model.getUsername());
                        holder.fullname.setText(model.getFullname());
                        Picasso.get().load(model.getProfileimage()).placeholder(R.drawable.friends_result_icon).fit().into(holder.userimage);
                    }

                    @NonNull
                    @Override
                    public FindFriendsHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
                    {
                        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.search_friends_result_layout,viewGroup,false);
                        FindFriendsHolder viewHolder = new FindFriendsHolder(view);
                        return viewHolder;
                    }
                };

        searchResultList.setAdapter(adapter);
        adapter.startListening();
    }


    public static class FindFriendsHolder extends RecyclerView.ViewHolder
    {

        TextView username, fullname;
        ImageView userimage;

        public FindFriendsHolder(@NonNull View itemView)
        {
            super(itemView);

            username = itemView.findViewById(R.id.username_result);
            fullname = itemView.findViewById(R.id.fullname_result);
            userimage = itemView.findViewById(R.id.friend_result_image);
        }

    }

}///end
  

Я провел некоторое исследование и обнаружил, что мне нужно создать запрос и установить для него значение Startat (Edittext).EnDat(EditText), но я не уверен, куда на самом деле вставить запрос.

с помощью следующего кода я могу отобразить каждого пользователя в базе данных.

любая помощь была бы отличной!

Комментарии:

1. Что происходит, когда вы используете этот код?

2. При запуске void все пользователи собираются и отображаются. У меня есть текстовое поле и что нужно вручную находить пользователей с помощью поиска

Ответ №1:

Согласно вашим комментариям, теперь вы получаете всех пользователей. Если вы хотите получить только одного пользователя, пожалуйста, измените следующую строку кода:

 Query searchpeople = allUsersDatabase.orderByChild("username").startAt(seachbox)
                    .endAt(seachbox   "uf8ff");
  

Для

 Query searchpeople = allUsersDatabase.orderByChild("username").equalTo(seachbox);
  

Комментарии:

1. Да, проблема в том, что я никогда не вызываю запрос searchpeople, я не был уверен, где его вызвать.

2. нет, это не работает, как я упоминал ранее. В моем коде я не вызывал запрос searchpeople

3. В таком случае, почему вы не вызвали запрос searchpeople? Это то, чего вы хотите?

4. да, я разобрался со своей проблемой. Когда .setQuery я вызывал allusersDatabase вместо того, чтобы передавать запрос searchpeople. Код работает безупречно, будет отмечен как правильный ответ.

Ответ №2:

Если вы хотите упростить задачу, вы можете использовать Firestore вместо базы данных реального времени. Но, если вы хотите по-прежнему использовать RealtimeDB, вы можете создать условный цикл, подобный:

 if(edtUsername.text.toString == username){
   // Your code
}