0

예를 들어, 문제점 목록이 있습니다. 각 문제에 소유자 uid가 있습니다. 이 uid를 통해 필요한 사용자를 찾고 이름과 사진을 표시해야합니다.Firebase 데이터베이스 쿼리 사용자에게 루프

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

     }) 
    } 

getIssueOwner 방법 : I 도움 아키텍처 구성 요소의 ViewModel와 함께 할

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 
} 

하지만이 방법이 정확하지 않습니다 확신 해요. 내 앱 아키텍처를 어떻게 구축해야하는지 조언 해 주시겠습니까?

답변

0

이 :

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

훨씬 간단이 정확히 같은 결과를 제공합니다 :

val userReference = usersReference.child(uid) 

둘 사이의 유일한 차이점은 첫번째 조각이 하나의 목록이 당신에게 스냅 샷을 제공한다는 것입니다 두 번째 스 니펫은 항목이있는 스냅 샷을 제공합니다.

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이 아직 호출되지 않았기 때문입니다.

+0

감사 등 어쩌면 당신은 좋은 방법을 안드로이드에서 JOIN 쿼리를 수행하는 방법을 알고, 도와주세요) – LeShChEnKoUa

관련 문제