私は、ユーザーのコレクションを持っていると私は、データベースからすべてのユーザーを照会し、それらを表示したいRecyclerView
除く1、鉱山。これは私のDBスキーマです:
users [collection]
- uid [document]
- uid: "fR5bih7SysccRu2Gu9990TeSSyg2"
- username: "John"
- age: 22
- //other users
どのようにのようなデータベースを照会します:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query q = db.collection("users").whereNotEqualTo("uid", uid);
だから私はに渡される、このクエリオブジェクトを必要とするFirestoreRecyclerOptions
他のすべてのユーザーを表示するために、オブジェクトRecyclerView
。
これさえ可能ですか?そうでない場合、どのように私はこの問題を解決することができますか?ありがとう!
編集:
options = new FirestoreRecyclerOptions.Builder<UserModel>()
.setQuery(query, new SnapshotParser<UserModel>() {
@NonNull
@Override
public UserModel parseSnapshot(@NonNull DocumentSnapshot snapshot) {
UserModel userModel = documentSnapshot.toObject(UserModel.class);
if (!userModel.getUid().equals(uid)) {
return userModel;
} else {
return new UserModel();
}
}
}).build();
この問題に苦しんでの日と日後、私は最終的に答えを見つけました。私は@Rajの助けを借りずにこの問題を解決することができませんでした。あなたの忍耐と指導のためにそんなに@Rajをありがとうございます。
まずオフ、これから彼の答えに@FrankバンPuffelenが提供する答えによると、ポスト、私は私は、単一のアダプターに2つのクエリを渡すことができます解決策を探して停止しました。
この質問では、すべて私が達成したいことは、1、私以外のすべてのユーザーを取得するためにデータベースを照会することでした。我々は、単一のインスタンスに2つのクエリを組み合わせることはできませんので、だから、私たちは両方のクエリの結果を組み合わせることができますことを見出しました。だから私は2つのクエリを作成しました:
FirebaseFirestore db = FirebaseFirestore.getInstance();
Query firstQuery = db.collection("users").whereLessThan("uid", uid);
Query secondQuery = db.collection("users").whereGreaterThan("uid", uid);
私が持ってるUserModel
私のユーザーオブジェクトの(POJO)クラスを。私が見つかりません1が、2つの問題を解決する方法。一つ目は、すべてのユーザーが最初の基準とその対応オブジェクトを取得し、リストに追加するには、データベースを照会することです。その後、再びデータベースを照会し、他のユーザが第2の基準とその対応オブジェクトを取得し、それらを追加し、同じリスト。今、私はすべて私が必要とするユーザーが、1つ、クエリからその特定のIDを持つものを含むリストを持っています。これは、将来の訪問者のためのコードです:
firstQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
List<UserModel> list = new ArrayList<>();
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
UserModel userModel = document.toObject(UserModel.class);
list.add(userModel);
}
secondQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
UserModel userModel = document.toObject(UserModel.class);
list.add(userModel);
}
//Use the list of users
}
}
});
}
}
});
私が使用しているため、第2のアプローチは、はるかに短くなりTasks.whenAllSuccess()
、このように:
Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();
Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
@Override
public void onSuccess(List<Object> list) {
//This is the list that I wanted
}
});