【问题标题】:Firebase : How to search all objects with same value in whole database or nested databaseFirebase:如何在整个数据库或嵌套数据库中搜索具有相同值的所有对象
【发布时间】:2026-02-18 13:25:02
【问题描述】:

如何从嵌套数据库中获取具有相同name_mov 值的所有对象。我有一个EditText,从中我得到一个字符串,用于从嵌套数据库中搜索具有相同mov_name 值的对象。我想使用 Firebase-UI 在RecyclerView 中显示bolly/newbolly/popular 下所有具有相同mov_name 值的对象的列表。

这是数据库结构:

我做了什么-

@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);
}

【问题讨论】:

    标签: java android firebase search firebase-realtime-database


    【解决方案1】:

    您无法使用您的数据库结构来实现这一点,因为在您的根节点和包含 name_mov 属性的对象之间有 4 个子节点,movbollynew 和推送的 id .

    您可以使用以下查询:

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

    通过这种方式,您的级别会降低,并且查询可以正常工作。

    【讨论】:

    • 我无法更改我的数据库结构。我应该进行多个firebase查询并将这些查询的响应组合在一个列表中以显示在recyclerview中吗?或者有什么办法可以存档。
    • 是的,您也可以继续这样做,但前提是您有 2 或 3 个这样的节点。如果你有更多,我仍然建议你改变你的数据库结构。