Не удается при поиске в представлении переработчика Firebase - PullRequest
0 голосов
/ 29 августа 2018

Я пытался искать в базе данных Firebase из диалогового окна поиска материалов. Мне это удалось, но проблема в том, что я могу искать только по заголовкам (моя база данных также содержит заголовок и описания), хотя я пробовал довольно много вещей, но у меня ничего не получалось.

В какой-то момент мне удалось создать другую функцию поиска для поиска по описаниям, но затем результаты поиска по заголовкам оказались неправильными.

Я прилагаю приведенный ниже код, пожалуйста, посмотрите на него и дайте мне знать, могу ли я что-то сделать для поиска по заголовкам и описаниям.

Объявления и код (я пропустил ненужные части из кода активности)

    materialSearchBar = homeView.findViewById(R.id.searchBar);
        materialSearchBar.setHint("Search Ad");
        loadSuggest();
        materialSearchBar.setLastSuggestions(suggestList);
        materialSearchBar.setCardViewElevation(10);
        materialSearchBar.addTextChangeListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                List<String> sugest = new ArrayList<String>();
                for (String search : suggestList) {
                    if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase()))
                        sugest.add(search);
                }
                materialSearchBar.setLastSuggestions(sugest);

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
        materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
            @Override
            public void onSearchStateChanged(boolean enabled) {
                if (!enabled)
                    mallUsers.setAdapter(firebaseRecyclerAdapter);
            }

            @Override
            public void onSearchConfirmed(CharSequence text) {

                startSearch(text);

            }

            @Override
            public void onButtonClicked(int buttonCode) {

            }
        });
// start search and load suggestions methods
    private void startSearch(CharSequence text) {
        String searchText = text.toString();
        Query query1 = mDatabase1.orderByChild("title").startAt(searchText).endAt(searchText + "\uf8ff");
        Query query2 = mDatabase1.orderByChild("description").startAt(searchText).endAt(searchText + "\uf8ff");
        FirebaseRecyclerOptions<Ad> firebaseRecyclerOptions2 = new FirebaseRecyclerOptions
                .Builder<Ad>()
                .setQuery(query1, Ad.class)
                .build();

        searchAdapter = new FirebaseRecyclerAdapter<Ad, UsersViewHolder1>(firebaseRecyclerOptions2) {
            @Override
            protected void onBindViewHolder(@NonNull UsersViewHolder1 holder, int position, @NonNull Ad ad1) {
                holder.setTitle(ad1.getTitle());
                holder.setPrice(ad1.getPrice());
                holder.setCategory(ad1.getCategory());
                holder.setImage(ad1.getImage(), getContext());
                holder.setTime(ad1.getTime());


                String user_id = getRef(position).getKey();
                final String kk = user_id.toString();

                holder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent mew = new Intent(getActivity(), ExpandActivity.class);
                        mew.putExtra("user_id", kk);
                        startActivity(mew);

                    }
                });

            }

            @NonNull
            @Override
            public UsersViewHolder1 onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout
                                .user_ad_layout, parent,
                        false);

                return new UsersViewHolder1(view1);
            }
        };
        searchAdapter.startListening();
        mallUsers.setAdapter(searchAdapter);


    }


    private void loadSuggest() {
        mDatabase1.orderByKey().addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot postdataSnapshot : dataSnapshot.getChildren()) {
                    Ad item = postdataSnapshot.getValue(Ad.class);
                    if (item != null) {
                        suggestList.add(item.getTitle());
                        suggestList.add(item.getDescription());
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы уже испытали самую низкую особенность Firebase, запрашивая. Однако вы можете запросить несколько значений, если, например, загрузите в firebase заголовок и описание, например:

user:
post:
    title: "cake"
    description: "yummy"
    titledescription: "cake_yummy"

как то так. Еще одна вещь, которую вы можете сделать, это

private boolean hasValue = false;
private boolean hasValue1 = false;

заданное значение истинно внутри onBindViewHolder и затем использует значения запроса задержки обработчика по одному:

Handler myHandler1 = new Handler();
Runnable myRunnable1 = new Runnable() {
   @Override
   public void run() {
       // query1 here
   }
};

Handler myHandler2 = new Handler();
Runnable myRunnable2 = new Runnable() {
   @Override
   public void run() {
       // query2 here
   }
};

затем вы проверяете их по одному, пока не найдете значение

   if(!hasValue){
     myHandler1.postDelayed(myRunnable1, 1000);
        if(!hasValue1){
           myHandler2.postDelayed(myRunnable2, 1500); 
        } else {
           myHandler1.removeCallbacks(myRunnable1);
           hasValue1 = false;
     } else {
     myHandler2.removeCallbacks(myRunnable2);
     hasValue2 = false;
     }
 }

Надеюсь, это поможет.

0 голосов
/ 29 августа 2018

Согласно этому сообщению , вы не можете передать два запроса одному адаптеру. Таким образом, вы можете передать или query1 или query2.

К сожалению, база данных Firebase Realtime не поддерживает запросы к нескольким свойствам (некоторые люди говорят «несколько выражений where» в терминах SQL), поддерживает только запросы к одному дочернему свойству. Поэтому вам нужно создать дополнительное поле, чтобы сохранить оба поля. Поэтому для достижения этого вам нужно создать новое поле, которое в вашей базе данных должно выглядеть следующим образом:

Firebase-root
   |
   --- itemId
          |
          --- title: "valueOfTitle"
          |
          --- description: "valueOfDescription"
          |
          --- title_description: "valueOfTitle_valueOfDescription"

Итак, как вы видите, свойство title_description объединяет значения, по которым вы хотите фильтровать. Но база данных Firebase реального времени не поддерживает собственную индексацию или поиск текстовых полей в объектах. Кроме того, загрузка всего режима для поиска полей на стороне клиента нецелесообразна. Тем не менее, вы можете сделать это для небольших наборов данных, но, как я уже говорил, не подходит для больших наборов данных. Чтобы включить полнотекстовый поиск в вашей базе данных Firebase real-tme, я рекомендую вам использовать стороннюю службу поиска, такую ​​как Algolia .

В отличие от базы данных Firebase Realtime, Cloud Firestore позволяет составные запросы . Вы должны взглянуть на это. Таким образом, запрос, как показано ниже, разрешен в Cloud Firestore без создания объединенного свойства.

itemIdRef.whereEqualTo("title", "valueOfTitle").whereEqualTo("description", "valueOfDescription");

Если вы хотите использовать Algolia в Cloud Firestore, я рекомендую вам посмотреть мой ответ из этой записи . Для получения дополнительной информации, я также рекомендую вам посмотреть видео .

...