2017-10-13 35 views
1

私は、年長の子供が子供を拾って学校に通うことができるアンドロイドアプリケーションを開発しています。アプリケーションでは、認証された(電子メールとパスワード)の若い子供は、取得する3つのアドレスの間で選択することができます。とおり、今、私のリアルタイム・データベースは、次のようになります。私は別のアドレスや住所を選んだユーザーを検索したいAndroid - Firebaseからデータを取得する

enter image description here

。私は、データを取得するためには、recyclerviewを使用する必要があると思っていますが、私はそれが私のデータベース構造で行うことが可能かどうかは不明です。

enter image description here

+0

これは実現可能ですが、私は間違いなくこれを助けるためにFirebaseUIを見ることをお勧めします。 'FirebaseRecyclerAdapter'のような特別なアダプタを持っています。これについて具体的には、私は見ています:https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md#using-firebaseu-with-indexed-data –

+0

答えをありがとう、私は見たあなたが提供したリンクでは、私はまだノードを照会する方法に疑問があります。 Adressesノードからユーザー名を取得するにはどうすればよいですか? – JDoe

+0

@FrankvanPuffelen私はあなたがここでの答えで飛び散ってもかまわないと願っています - あなたのコメントを見つける前にドラフトしました! – Grimthorr

答えて

1

続きを読む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値、および

    • usersリストこのデータ重複での主な欠点住所。

    同様に、ユーザーがユーザー名を変更できる場合は、ユーザーのノードと同様に、選択したアドレスでユーザー名を更新する必要があります。

    この処理の詳細については、this answer which explains a number of methodsを参照してください(例はJavaScriptですが、前提は引き続き適用されます)。

  • +0

    ありがとう、私はこれを試してみます。元の投稿との混乱をおかけして申し訳ありません。 – JDoe

    +0

    FirebaseRecyclerAdapterインスタンスの作成が完了しました。私はonBindViewHolderメソッドでユーザーを一覧表示するために、ユーザーマップにアクセスする方法について疑問に思っています。何か案は? – JDoe

    +0

    したがって、 'onBindViewHolder()'の 'model'パラメータにアクセスする必要があります。これは各行の' Address'モデルのインスタンスになります。 'getUsers()'と[このマップを反復する](https://stackoverflow.com/a/1066607)を使うことができます。たとえば、次のようにします。 'for(String username:model.getUsers.values()){textView.append(username +"& ")}' – Grimthorr

    2

    FirebaseUI database packageを使用すると、それは簡単なあなたのアプリのUIにFirebaseリアルタイムデータベースからデータをバインドすることができます。特にusing FirebaseUI with indexed dataは現在のデータベース構造に適用されます。

    あなたのUserクラスがある
    // keyQuery - the Firebase location containing the list of keys to be found in dataRef 
    // dataRef - the Firebase location to watch for data changes. Each key found at 
    //   keyRef's location represents a list item. 
    
    Query keyQuery = FirebaseDatabase.getInstance().getReference("/Addresses/Street 10/users"); 
    DatabaseReference dataRef = FirebaseDatabase.getInstance().getReference("/User"); 
    
    FirebaseRecyclerOptions<User> options = new FirebaseRecyclerOptions.Builder<User>() 
         .setIndexedQuery(keyQuery, dataRef, User.class) 
         .build(); 
    

    public class User { 
        private String username; 
    
        public User() {} 
    
        public String getUsername() { 
         return this.username; 
        } 
    
        public void setUsername(String username) { 
         this.username = username; 
        } 
    
        // ... 
    } 
    

    あなたはその後、create a FirebaseRecyclerAdapter instanceに上記で作成したoptions変数を使用して、startListening()を呼び出すことができます

    たとえば、あなたはに類似したものを使用したいですそれに*。

    このようにFirebaseUIを使用すると、/Addresses/Street 10/usersの鍵と/Userのノードの一致が自動的に処理されます。


    * FirebaseUIのバージョン2.xではなくFirebaseIndexRecyclerAdapterを使用していますので、startListening()コールを必要としない、自動的に待機を開始。上記の例は、バージョン3.0に適用されます。FirebaseUI 3.0 upgrade guideを参照してください。

    +0

    コンストラクタがパブリックItemになる方法を尋ねることはできますか? – JDoe

    +0

    私の間違い!私はそれを修正しました。 – Grimthorr

    +0

    答えていただきありがとうございます:)私は試してみます – JDoe

    関連する問題