0

Zum Beispiel habe ich eine Liste von Problemen. Jede Ausgabe hat Besitzer uid. Durch diese UID sollte ich benötigte Benutzer finden und seinen Namen und Foto anzeigen. Ich mache es mit Hilfe Architektur Komponente Ansichtsmodell:Firebase Datenbank Abfrage Benutzer in einer Schleife

issues.forEach { 
     IssueRepository().getIssueOwner(it.owner).observe(this, Observer { 

     }) 
    } 

getIssueOwner Methode:

fun getIssueOwner(uid: String): MutableLiveData<UserEntity> { 
    val user: MutableLiveData<UserEntity> = MutableLiveData() 
    val usersReference = FirebaseDatabase.getInstance().reference.child("users") 
    val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1) 
    query.addValueEventListener(object : ValueEventListener { 
     override fun onCancelled(p0: DatabaseError?) { 
     } 

     override fun onDataChange(dataSnapshot: DataSnapshot?) { 
      if (dataSnapshot == null) { 
       return 
      } 
      dataSnapshot.children.forEach { 
       val name = it.child("displayName").value 
       user.postValue(UserEntity(name)) 
      } 

     } 
    }) 
    return user 
} 

Aber ich bin sicher, dass dieser Ansatz nicht korrekt ist. Könntest du mir bitte einen Rat geben, wie ich die Architektur meiner App aufbauen soll?

Antwort

0

Dies:

val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1) 

gibt genau die gleichen Ergebnisse wie diese viel einfacher:

val userReference = usersReference.child(uid) 

Der einzige Unterschied zwischen den beiden ist, dass das erste Schnipsel Sie mit einer Liste von einem einen Schnappschuss gibt Gegenstand, während der zweite Ausschnitt Ihnen einen Schnappschuß mit nur dem Einzelteil gibt.

val userReference = usersReference.child(uid) 
userReference.addValueEventListener(object : ValueEventListener { 
    override fun onCancelled(error: DatabaseError?) { 
     throw error.toException() // don't ignore errors 
    } 

    override fun onDataChange(dataSnapshot: DataSnapshot?) { 
     if (dataSnapshot.exists() 
      val name = dataSnapshot.child("displayName").value 
      user.postValue(UserEntity(name)) 
     } 
    } 
}) 

Beachten Sie, dass Sie noch keinen Benutzer aus der getIssueOwner Methode zurückkehren können. Dies liegt daran, dass Daten asynchron aus Firebase geladen werden. Wenn Ihre Anweisung return ausgeführt wird, wurde onDataChange noch nicht aufgerufen.

empfehle ich Ihnen zu diesem Thema ein paar dieser vorherigen Frage zu lesen, um mehr über die asynchrone Natur von Firebase zu tun (und die meisten der modernen Web):

+0

Dank al ot, vielleicht kennst du einen guten Weg, wie man JOIN query in Android ausführt, bitte hilf mir) – LeShChEnKoUa

Verwandte Themen