首页 文章

Android Firebase orderByChild查询

提问于
浏览
1

我目前正在使用Firebase编写Android应用程序 . 我有一个具有城市属性的产品型号 . 我正在运行以下查询:

mDatabaseReference = FirebaseDatabase.getInstance().getReference();
mDatabaseReference.keepSynced(true);

productQuery = mDatabaseReference.child("products")
                   .orderByChild("city").equalTo(mCurrentUser).limitToFirst(100);

此查询将检索数据库中的所有产品,而不考虑城市 .

我花了最后四个小时审查关于SO的类似问题,并尝试索引规则的查询函数的不同组合无济于事 . 我有一个我称之为愚蠢的解决方案,它重新复制城市产品树下的数据 . 但是我猜测有一个更好的方法来利用orderByChild,如果我能得到一些帮助来查询城市数据,我将不胜感激 .

感谢您的输入

这是CityFeed片段 - 注意:我检查了mCurrentUserCity已设置

public class CityFeedFragment extends BaseFragment {
    private RecyclerView mRecyclerView;
    private String mCurrentUserCity;
    private FirebaseProductAdapter mAdapter;
    private DatabaseReference mDatabaseReference;
    private LinearLayoutManager mManager;
    private Query productQuery;
    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_feed, container, false);
        mDatabaseReference = FirebaseDatabase.getInstance().getReference();
        mDatabaseReference.keepSynced(true);

        retrieveCity();
        fetchProducts();

        mAdapter = new FirebaseProductAdapter(Product.class,
                R.layout.feed_item, ProductViewHolder.class,
                productQuery.getRef(), getContext(), false);

        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
        mRecyclerView.setAdapter(mAdapter);

        mManager = new LinearLayoutManager(getActivity());
        mManager.setReverseLayout(true);
        mManager.setStackFromEnd(true);

        mRecyclerView.setHasFixedSize(true);

        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setLayoutManager(mManager);


        mSwipeRefreshLayout.setOnRefreshListener(() -> {
            fetchProducts();
            mAdapter.notifyDataSetChanged();
            mSwipeRefreshLayout.setRefreshing(false);
        });

    }


    private void fetchProducts() {
        productQuery = mDatabaseReference.child("products").orderByChild("city").equalTo(mCurrentUserCity);
    }

    private void retrieveCity() {
        mDatabaseReference.child("users").child(getUid()).addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        User user = dataSnapshot.getValue(User.class);
                        if (user == null) {
                            showToast(getResources().getString(R.string.empty_user));
                        } else {
                            mCurrentUserCity = user.getCity();
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        showToast(databaseError.toString());
                        Log.w("Cityfeed", "getUser:onCancelled", databaseError.toException());
                    }
                }
        );
    }

}

数据结构
enter image description here

1 回答

  • 4

    除了添加用于将值作为数据快照的侦听器之外,您已经完成了所有操作 . 请用这个替换你的方法 -

    private void fetchProducts() {
        productQuery = mDatabaseReference.child("products").orderByChild("city").equalTo(mCurrentUserCity).addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //Map of all products which has city equal to mCurrentUserCity 
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                }
        );
    }
    

相关问题