Firebase: как искать все объекты с одинаковым значением во всей базе данных или во вложенной базе данных - PullRequest
1 голос
/ 24 марта 2019

Как получить все объекты с одинаковым значением name_mov из вложенной базы данных. У меня есть EditText, откуда я получаю строку для поиска объектов с таким же значением mov_name из вложенной базы данных. Я хочу показать список всех объектов в bolly/new, а также bolly/popular с таким же значением mov_name в RecyclerView с Firebase-UI.

Вот структура базы данных:

enter image description here

Что я сделал -

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


    progressBar = findViewById(R.id.spin_search);
    progressBar.setVisibility(View.GONE);
    recyclerView = findViewById(R.id.rec_search);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    editText = findViewById(R.id.ed_search);
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            firebaseSearch(s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebaseDatabase.getReference();
}


//search data
private void firebaseSearch(String s) {
    /*Toast.makeText(AllUserActivity.this, "Started Search", Toast.LENGTH_LONG).show();*/
    progressBar.setVisibility(View.VISIBLE);


    Query firebaseSearchQuery = mDatabaseReference.equalTo(s);

    //set Options
    FirebaseRecyclerOptions<MovieObj> options =
            new FirebaseRecyclerOptions.Builder<MovieObj>()
                    .setQuery(firebaseSearchQuery, MovieObj.class)
                    .setLifecycleOwner(this)
                    .build();


    adapter = new FirebaseRecyclerAdapter<MovieObj, SearchMovHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull SearchMovHolder holder, int position, @NonNull MovieObj model) {

            progressBar.setVisibility(View.GONE);


            holder.name.setText(model.getName_mov());
            holder.rating.setText( model.getRating());
            holder.year.setText( model.getYear());

            Glide.with(holder.img_back.getContext())
                    .load(model.getImgback())
                    .into(holder.img_back);


        }

        @NonNull
        @Override
        public SearchMovHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_mov_item, parent, false);
            return new SearchMovHolder(mView);
        }


    };

    recyclerView.setAdapter(adapter);
}

1 Ответ

1 голос
/ 24 марта 2019

Невозможно достичь этого, используя структуру базы данных, поскольку между вашим корневым узлом и объектами, содержащими свойство name_mov, есть 4 дочерних элемента, mov, bolly, new и заданный идентификатор.

Вы можете использовать следующий запрос:

Query firebaseSearchQuery = mDatabaseReference
    .child("mov")
    .child("bolly")
    .child("new")
    .orderByChild("name_mov")
    .equalTo(s);

Но вы сможете получить только названия фильмов, которые существуют в узле new.Если вы хотите получить все титры, вам следует реструктурировать базу данных, добавив тип фильма (новый, популярный и т. Д.) В качестве свойства ваших объектов, а затем просто использовать:

Query firebaseSearchQuery = mDatabaseReference
    .child("mov")
    .child("bolly")
    .orderByChild("name_mov")
    .equalTo(s);

Таким образом, у вас будет меньше уровень, и запрос будет отлично работать.

...