2017-02-23 2 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

데이터 구조 데이터 스냅 샷으로 이 방법으로 바꾸십시오 -

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

       } 
      } 
    ); 
}