2017-02-23 13 views
0

現在、Firebaseを使用してAndroidアプリケーションを作成しています。私は都市属性を持つ製品モデルを持っています。 私は、次のクエリを実行しています:AndroidのFirebaseのorderByChildクエリ

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

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

このクエリは関係なく、街のデータベース内のすべての製品を検索します。

私は過去4時間を同じような質問を見直して、さまざまな組み合わせのクエリ関数+ルールのインデックス付けを無駄にしました。 私は都市製品ツリーの下でデータを再複製するダムソリューションと呼んでいます。しかし、私は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

に設定されている確認あなたは値を取得するためのリスナーを追加すること以外のすべてを行っていますデータスナップショットとして。あなたの方法をこれで置き換えてください -

関連する問題