2017-02-01 1 views
1

Angenommen, ich habe eine App mit Benutzern, die Haustiere besitzen.Wie Sie Beziehungen in Firebase in Android-Apps abfragen

Von dem, was ich in verschiedenen Quellen zu lesen, ist dies eine gültige Weise Beziehungen in Firebase DB zu modellieren:

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

Sagen, ich habe einen Android-App, und ich möchte eine Liste aller Nutzer präsentieren und in jedem Listenelement auch angeben, welche Haustiere der Benutzer besitzt.

Was ich will ist eine Liste von Benutzerobjekten, wo jedes Benutzerobjekt eine Liste von Pet-Objekten hat. Zum Beispiel:

public class User { 

    public String name; 
    public List<Pet> pets; 

    ... 
} 

Was ist der beste Weg, die DB abzufragen, um dieses Ergebnis zu erhalten?

+0

Was ist das Problem/Anliegen:

Feuerbasis Objekte in Ihrer POJO Zur Karte, ich habe 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); 

Und meine ViewHolder Klasse verwendet? Weil es scheint eine Kombination von [Laden von Benutzern aus einer Liste] (https://firebase.google.com/docs/database/android/lists-of-data#child-events) und dann [bei den Haustieren] (http : //stackoverflow.com/q/31670234) (oder [eine davon] (http://stackoverflow.com/search?q=%5Bfirebase%5D%5Bandroid%5D+join)). Wenn Sie sich Sorgen um die Join-Leistung machen, lesen Sie [meine Antwort hier] (http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using) -Abfrage-statt-obse/35932786 # 35932786). –

+0

Danke @FrankvanPuffelen, meine Sorge ist das: Was ich will, ist eine Liste von Benutzerobjekten (wie in der Frage gezeigt). Sagen Sie zum Beispiel, ich habe 100 Benutzer, bedeutet es, dass ich eine Abfrage für die Benutzer durchführen muss, und dann Schleife und für jeden Benutzer eine weitere Abfrage (100 Abfragen)? Und dann muss ich die Haustierliste jedes Benutzers selbst festlegen ... Das scheint einfach komplex und unbequem zu sein. – dors

+0

Wenn Sie 100 Benutzer anzeigen und eine indizierte Datenstruktur verwenden möchten, müssen Sie 100 Elemente abrufen. Es ist eine clientseitige Join-Operation, die tatsächlich zu mehr clientseitigen Code führt. Aber es ist nicht so langsam, wie Sie vielleicht denken, wie im letzten Link in meinem ersten Kommentar erklärt. –

Antwort

0

Sie müssen zuerst eine Abfrage, wenn man bedenkt Sie die FirebaseDatabase Instanz

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

haben Wenn Sie mehr darüber, wie die gemeinsame SQL-Abfragen lesen möchten, werden in Firebase durchgeführt, können Sie es hier lesen Common SQL Queries Converted for Firebase

Dann Mit FirebaseUI können Sie die Daten anzeigen, wie Sie möchten.

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

Danke, aber ich sehe nicht, wie das beantwortet meine Frage über Tabellen beitreten in FB – dors

+0

Es gibt keine Tabellen als solche in Firebase. [This] (https://firebase.google.com/docs/database/web/structure-data) hilft Ihnen dabei. – Dudupoo

+0

@dors Ich habe meine Antwort bearbeitet, ich hoffe, es wird helfen. – Dudupoo

Verwandte Themen