続きを読むmy previous answerに続き、このアドレスは、あなたが探しているものに近いかもしれないすべてのアドレスとその関連ユーザのリストを作成するというあなたの要求に対応する必要があります。
また、FirebaseUI database packageを使用すると、RecyclerViewの作成を簡略化できます。
あなたのデータ構造はまた、アドレスのノードでのユーザ名を含める必要がありますので、あなたは、あなたのデータを非正規化を開始する必要があります:
{
"Addresses" : {
"Street 10" : {
"name" : "Street 10",
"users" : {
"VAzdMWafK6cyhmJnOI4br5xiQg93" : "John"
}
}
},
"User" : {
"VAzdMWafK6cyhmJnOI4br5xiQg93" : {
"username" : "John",
"address" : "Street 10"
}
}
}
注:あなたが唯一の彼らの選択したアドレスにユーザーIDを追加する必要があります(とユーザーが選択を変更した場合はノードを削除します)、混乱を招く可能性があるため、ユーザーが選択していないアドレスには"VAzdMWafK6cyhmJnOI4br5xiQg93" : false
を使用しないでください。
は、次に、あなたが使用することができます。
Query query = FirebaseDatabase.getInstance().getReference("/Addresses");
FirebaseRecyclerOptions<Address> options = new FirebaseRecyclerOptions.Builder<Address>()
.setQuery(query, Address.class)
.build();
Address
のようなものです:options
変数から
public class Address {
private String name;
private Map<String, String> users;
public Address() {}
public Map<String, String> getUsers() {
return this.users;
}
// ...
}
そしてcreate a FirebaseRecyclerAdapter
instanceが。次に、アダプターでビューホルダーをバインドすると、User
オブジェクト全体を不必要にロードする必要なく、users
マップにアクセスしてこのアドレスを選択した各ユーザーをリストすることができます。
このパターンはdenormalizationと呼ばれ、NoSQLデータベース(Firebase Realtime Databaseなど)を使用する際に推奨される方法です。例えばので、ユーザーは自分の選択したアドレスを変更したとき、あなたは変更する必要があります:下のユーザーの下address
値、および
同様に、ユーザーがユーザー名を変更できる場合は、ユーザーのノードと同様に、選択したアドレスでユーザー名を更新する必要があります。
この処理の詳細については、this answer which explains a number of methodsを参照してください(例はJavaScriptですが、前提は引き続き適用されます)。
これは実現可能ですが、私は間違いなくこれを助けるためにFirebaseUIを見ることをお勧めします。 'FirebaseRecyclerAdapter'のような特別なアダプタを持っています。これについて具体的には、私は見ています:https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md#using-firebaseu-with-indexed-data –
答えをありがとう、私は見たあなたが提供したリンクでは、私はまだノードを照会する方法に疑問があります。 Adressesノードからユーザー名を取得するにはどうすればよいですか? – JDoe
@FrankvanPuffelen私はあなたがここでの答えで飛び散ってもかまわないと願っています - あなたのコメントを見つける前にドラフトしました! – Grimthorr