2017-02-01 12 views
1

ペットを所有しているユーザーがいるアプリがあります。AndroidアプリでFirebaseのリレーションを照会する方法

私は、さまざまなソースで読んだから、これはFirebase DB内の関係をモデル化するための有効な方法である:

{ 
    "users":{ 
    "user1":{ 
     "name":"Arthur", 
     "pets":{ 
      "pet1":true, 
      "pet2":true 
     } 
    }, 
    "user2":{ 
     "name":"George", 
     "pets":{ 
     "pet3":true, 
     "pet4":true 
     } 
    } 
    }, 
    "pets":{ 
    "pet1":{...}, 
    "pet2":{...}, 
    "pet3":{...}, 
    "pet4":{...} 
    } 
} 

は、私はAndroidアプリを持っている、と私はすべてのユーザーのリストを提示したいと各リスト項目には、ユーザーが所有しているペットについても記載されています。

私が欲しいのは、各ユーザオブジェクトにペットオブジェクトのリストを持つユーザオブジェクトのリストです。例:

この結果を得るためにDBを照会する最良の方法は何ですか?

+0

を問題/懸念は何ですか? [リストからユーザーを読み込む](https://firebase.google.com/docs/database/android/lists-of-data#child-events)と[ペットに参加する](http ://stackoverflow.com/q/31670234)(または[これらのいずれか](http://stackoverflow.com/search?q=%5Bfirebase%5D%5Bandroid%5D+join))。あなたが参加のパフォーマンスを心配しているなら、[私の答えはこちら]を読んでください(http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using)。 -query-of-obse/35932786#35932786)。 –

+0

ありがとう@FrankvanPuffelen、私の懸念はこれです:私が欲しいものは、質問に示されているようにユーザーオブジェクトのリストです。たとえば、100人のユーザーがいるとしたら、ユーザーのクエリを実行する必要があり、ループごとに別のクエリ(100クエリ)を作成する必要があるということですか?そして、私は自分の個人のペットのリストを設定する必要があります...これはちょうど複雑で不便だと思われます – dors

+0

100人のユーザーを表示し、インデックスデータ構造を使用する場合、100項目を取得する必要があります。これはクライアント側のジョイン操作であり、実際にはより多くのクライアント側のコードにつながります。しかし、私の最初のコメントの最後のリンクで説明されているように、思うほど遅くはありません。 –

答えて

0

は、あなたが最初にあなたが一般的なSQLクエリがFirebaseで実行されている方法についての詳細を読みたい場合は、FirebaseDatabaseインスタンス

databaseQuery = firebaseDatabase.child("users").child("user1").orderByChild("name"); 

を持って考えると、クエリを必要とする、あなたはCommon SQL Queries Converted for Firebase

ここでそれを読むことができます次に、FirebaseUIを使用して、必要な方法でデータを表示することができます。

あなたのPOJOにfirebaseオブジェクトをマッピングするために、私はのようにFirebaseUI

adapter = new FirebaseRecyclerAdapter<POJOClass, CustomVH>(POJOClass.class, R.layout.your_layout_file, CustomVH.class, databaseQuery) 
    { 
     @Override 
     protected void populateViewHolder(final CustomVH viewHolder,final POJOClass model, int position) 
     { 
      viewHolder.setListItemTitle(model.getItem()); 
      viewHolder.setListItemCategory(model.getCategory()); 
      viewHolder.setImageView(model.getDownloadImageUrl(),getContext()); 
     } 
    }; 
    recyclerView.setAdapter(adapter); 

そして、私のViewHolderクラスを使用している:

public class CustomVH extends RecyclerView.ViewHolder { 
private final TextView listItemTitle; 
public CheckBox checkBox; 
private final TextView listItemCategory; 
private ImageView imageView; 

public CustomVH(View itemView) 
{ 
    super(itemView); 
    listItemTitle = (TextView) itemView.findViewById(R.id.listItemText); 
    checkBox = (CheckBox) itemView.findViewById(R.id.checkBoxListItem); 
    listItemCategory = (TextView) itemView.findViewById(R.id.listItemCategoryText); 
    imageView = (ImageView) itemView.findViewById(R.id.customMyBucketListItemImage); 
    deleteButton = (ImageButton) itemView.findViewById(R.id.listItemDeleteButton); 
} 

public void setListItemTitle(String name) 
{ 
    listItemTitle.setText(name); 
} 

public void setListItemCategory(String category) 
{listItemCategory.setText(category);} 

public void setImageView(String imageUrl, Context context) 
{ 
    //set your imageview 
} 
} 
+0

ありがとう、しかし、これはFBでテーブルを結合することについて私の質問にどのように答えていないのですか? – dors

+0

Firebaseにテーブルはありません。 [This](https://firebase.google.com/docs/database/web/structure-data)が役立ちます。 – Dudupoo

+0

@dors私は私の答えを編集しました、私はそれが助けてくれることを願っています。 – Dudupoo