0

例えば、私は問題のリストを持っています。各問題に所有者uidがあります。このuidによって、私は必要なユーザーを見つけて、彼の名前と写真を表示する必要があります。Firebaseデータベースクエリのループ内のユーザ

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

     }) 
    } 

getIssueOwner方法:

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 
} 

しかし、私は、このアプローチが正しくないことを確信している私は助けアーキテクチャコンポーネントのViewModelでそれを行います。私は私のアプリのアーキテクチャを構築する方法についてアドバイスをお願いしますか?

答えて

0

この:

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

はこの全く同じ結果がはるかに簡単に得られます。

val userReference = usersReference.child(uid) 

両者の唯一の違いは、最初のスニペットはあなたに1つのリストでスナップショットを与えるということです2つ目のスニペットではアイテムだけのスナップショットが表示されます。

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)) 
     } 
    } 
}) 

getIssueOwnerの方法からユーザーを返すことはできません。これは、データがFirebaseから非同期にロードされ、returnステートメントが実行されるときに、onDataChangeがまだ呼び出されていないためです。

私はあなたがFirebaseの非同期性に対処する(そして現代のウェブのほとんど)についての詳細を学ぶために、そのトピックにこれらの前の質問のいくつかを読むことをお勧めします:

+0

おかげでアルあなたはAndroidでJOINクエリを実行する方法を知っているかもしれませんが、助けてください) – LeShChEnKoUa

関連する問題