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());
}
}
);
}
}
あなたのデータベース構造の写真を投稿してください。あなたの質問が本当に理解できません。 –
また、データを読むときに問題を再現する最小限のコードを含めてください。共有したコードはクエリを作成するだけですが、データはまだ取得されません。結果を記録する以外に何もしないリスナーがあればうれしいですが、私はまだそれを見たいと思います。 –
完了、ありがとうございました – Ender