Поиск содержимого в базе данных Firebase Live

#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");