Android Firebase orderByChild查询

时间:2017-02-23 18:45:21

标签: android firebase firebase-realtime-database

我目前正在使用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 个答案:

答案 0 :(得分:6)

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

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

                }
            }
    );
}