#android #firebase-realtime-database
#Android #firebase-база данных в реальном времени
Вопрос:
Когда я ищу элементы в своей базе данных firebase, я не получаю сообщение об ошибке, а вместо этого вообще не получаю значения. При прохождении через отладчик значения, которые у меня есть в EditText, фактически устанавливаются, и при поиске этих значений в запросе они не отображаются:
final EditText t = (EditText) findViewById(R.id.DjNameET);
mProfileDatabase = FirebaseDatabase.getInstance().getReference();
t.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if(i == EditorInfo.IME_ACTION_SEARCH)
{
searchData = t.getText().toString();
return true;
}
return false;
}
});
ImageButton imgB= (ImageButton) findViewById(R.id.searchBtn);
imgB.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
query = mProfileDatabase.child("djprofile").orderByChild("djName")
.startAt(searchData)
.endAt(searchData "uf8ff");
FirebaseRecyclerOptions<DjProfile> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DjProfile>()
.setQuery(query, DjProfile.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder>(firebaseRecyclerOptions)
{
@NonNull
@Override
public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.searchitem_list, viewGroup, false);
return new ResultsViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DjProfile model) {
holder.setDjProfile(model);
}
};
firebaseRecyclerAdapter.startListening();
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
});
Вот как выглядит живая база данных:
В моем редактируемом тексте, когда я ищу «DjRockSauce», в recyclerview не отображаются результаты, у меня такое чувство, что это потому, что я не получаю правильный путь в запросе, если это так, как мне правильно получить пути к файлам для поиска и отображения результатов?
Комментарии:
1.
mProfileDatabase.child("djprofile").orderByChild("djName")
Для меня это выглядит неплохо. Если вы удалитеorderByChild().startAt().endAt()
, отобразятся ли все дочерние узлы?2. Да, это так, я только что проверил
3. Итак, в этом случае путь правильный, и проблема заключается в порядке / фильтре. Если вы жестко закодируете условия поиска (so
.orderByChild("djName").startAt("Dj").endAt("Djuf8ff");
), это сработает?4. Ha! Да, это тоже работает
5. Я напечатал всплывающее сообщение строки, которую я передаю своим методам startAt () и EnDat (), и оно равно null, я собираюсь найти способ получить фактическое значение
Ответ №1:
Когда у вас возникает подобная проблема, правильный подход — попытаться найти, в чем проблема, а где ее нет.
Первым шагом может быть проверка, можете ли вы показывать нефильтрованные профили.
query = mProfileDatabase.child("djprofile");
Если здесь отображаются все профили, вы знаете, что созданный вами путь правильный.
Если это так, я бы попробовал использовать жестко запрограммированную строку поиска:
query = mProfileDatabase.child("djprofile").orderByChild("djName")
.startAt("Dr")
.endAt("Druf8ff");
Если это тоже работает, проблема заключается в том, как вы получаете поисковый запрос, и вам следует изучить это.
Ответ №2:
С помощью @Frank van Puffelen выяснил, что моя проблема заключалась в том, что я вызывал searchText, а он возвращал null. Когда на самом деле мне нужно было передать текст физического EditText name в поисковый запрос следующим образом:
query = mProfileDatabase.child("djprofile").orderByChild("djName")
.startAt(t.getText().toString()).endAt(t.getText().toString() "uf8ff");