2017-02-23 80 views
0

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

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

另请参见:请包含在读取数据时再现问题的最小代码。您现在共享的代码仅创建一个查询,但尚未检索任何数据。如果你有一个监听器只能记录结果,那么没关系,但我仍然希望看到它。 –

+0

完成,谢谢观看 – Ender

回答

2

你所做的一切,只是加入的侦听器获取值作为数据快照。请用您的方法替换您的方法 -

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

       } 
      } 
    ); 
}