#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
}