마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

LiveData Transformation 함수 사용방법?

0 추천
@Dao
interface WorkoutDao {
    @Query("SELECT * FROM Workout")
    @Transaction
    fun getAllWorkoutSetInfoList() : LiveData<List<WorkoutWithSets>>
}

 

data class WorkoutWithSets(
    @Embedded val workout: Workout,
    @Relation (
        parentColumn = "workoutId", // 참조하는 FK의 Column
        entityColumn = "parentWorkoutId" // 참조받는 FK의 Column
    )
    val sets: List<WorkoutSetInfo>
)

 

data class Routine(
    var workout: Workout,
    var sets: List<WorkoutSetInfo>,
    var isExpandable: Boolean = false
)

 

class RoutineRepository(application: Application) {
    private val workoutDao: WorkoutDao
    lateinit var routine : LiveData<List<Routine>>

    init {
        workoutDao = DetailDatabase.getDatabase(application).workoutDao()
    }
    fun getWorkoutInfo()  {
        Transformations.map(workoutDao.getAllWorkoutSetInfoList()) {

        }
    }
}

 

Dao 클래스에서 받아오는 LiveData<List<WorkoutWithSets>>를 Repository 클래스에서

Routine이라는 클래스로 가공을 하여 LIveData를 뷰모델에 리턴해주려고 하는데요,

(사실 WorkoutWithSets와 Routine은 boolean 값 하나차이긴 합니다..)

Transformation.map 이라는걸쓰면 LiveData<X> 에서 LiveData<Y>로 변경해서 반환할수있다고해서

이걸 사용하려고하는데요..

예제 코드들을 보니

val userLiveData : LiveData<User> = MutableLiveData(User("Jone", "Doe"))
val userName : LiveData<String> = Transformations.map(userLiveData) { user ->
    user.firstName + user.lastName        
}

이런식으로 LiveData의 타입이 List형식이 아니라 User처럼 단일형식이더라구요..

그런데 저같은경우는 List잖아요?

이런경우에는 Transformation.map() { it-> } 내에서  it을 사용하여 다시한번 map을 사용해줘야하나요?

아니면 Transformation.map() 대신에 switchmap을 사용하는게 좋을까요? 이건 내부에서 LiveData를 리턴해줘야해서 Room과 자주 사용된다던데..

또 아니면다른 더 좋은방법있을까요?

codeslave (3,940 포인트) 님이 2022년 7월 22일 질문
codeslave님이 2022년 7월 22일 수정

1개의 답변

0 추천

Transformation.map 메소드는 그냥 Collection.map 같이 사용하면 되는 걸로 보이는데요.

val workoutSetInfoListLiveData = getAllWorkoutSetInfoList()
val workoutListLiveData = Transformations.ma;(workoutSetInfoListLiveData) { -> workoutSetInfo 
    Routine(
       workout = workoutSetInfo.workout, 
       sets = workoutSetInfo.sets
    )
}  

다른 방법으로는 Dao가 LiveData가 아니라 그냥 일반 클래스타입을 리턴하게 하고 Collection.map을 사용해도 같은 걸 같아 보이네요.

@Dao
interface WorkoutDao {
    @Query("SELECT * FROM Workout")
    @Transaction
    suspend fun getAllWorkoutSetInfoList() : List<WorkoutWithSets>
}


class RoutineRepository(application: Application) {
    ....

    suspend fun getWorkoutInfo() = withContext(Dispatchers.IO)  {
       getAllWorkoutSetInfoList().map { workoutSet ->
              Routine(
                   workout = workoutSetInfo.workout, 
                   sets = workoutSetInfo.sets
             )
       }
    }
}

 

spark (226,420 포인트) 님이 2022년 7월 22일 답변
Transfrom.map 또는 switchmap이 LiveData를 리턴해주는 함수라 LiveData의 값이 변경될때마다 LiveData의 타입을 변경해서 바로바로 리턴해줘서 이걸 사용하는것이 효율적일것이다라고 생각했었는데 그냥 list형식으로 사용해야할것같네요..
...