사용자 도구

사이트 도구


android:queriedlist
queriedlist

참고할 기초지식

데이터를 쿼리하여 정렬하는 것은 관련 UI도 매우 중요하다. UI를 참조할 수 있는 샘플은 구글에서 제공하는 목록 및 그리드에 대한 스니펫 모음을 참고하자. 매우 잘 되어 있다.

List 내장 함수를 이용하여 데이터를 다루는 방법

스니펫 모음 예제를 보면 kotlin으로 데이터를 어떻게 다루는지 이해하기가 쉽다. 데이터베이스가 없는 경우에 데이터를 다루는 예제이므로 일어보면 도움이 된다.

class AnimatedOrderedListViewModel : ViewModel() {
    private val _data = listOf("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten")
    private val _displayedItems: MutableStateFlow<List<String>> = MutableStateFlow(_data)
    val displayedItems: StateFlow<List<String>> = _displayedItems
 
    fun resetOrder() {
        _displayedItems.value = _data.filter { it in _displayedItems.value }
    }
 
    fun sortAlphabetically() {
        _displayedItems.value = _displayedItems.value.sortedBy { it }
    }
 
    fun sortByLength() {
        _displayedItems.value = _displayedItems.value.sortedBy { it.length }
    }
 
    fun addItem() {
        // Avoid duplicate items
        val remainingItems = _data.filter { it !in _displayedItems.value }
        if (remainingItems.isNotEmpty()) _displayedItems.value += remainingItems.first()
    }
 
    fun removeItem() {
        _displayedItems.value = _displayedItems.value.dropLast(1)
    }
}

Room 데이터베이스에서 데이터 정렬하기

이제 데이터베이스를 이용할 경우를 살펴보도롣ㄱ 하자

1. SQL 쿼리 DAO 만들기

그렇다면 실제 RoomDatabase를 이요할 경우 데이터를 정렬하는 샘플을 만들어 보자

일단 DAO는 이렇게 만들 수 있을 것이다.

"ScoreDao.kt"
package com.dklaw.memorize.database
 
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Query
import androidx.room.Upsert
 
@Dao
interface ScoreDAO {
 
    @Upsert
    suspend fun upsertScore(score : Score)
 
    @Delete
    suspend fun deleteScore(score : Score)
 
    @Query("SELECT * FROM SCORE")
    fun getAllScores() : LiveData<List<Score>>
 
    @Query("SELECT * FROM SCORE ORDER BY " +
            "CASE WHEN :sortMethod='TitleASC'  THEN quoteTitle END ASC, quoteSection ASC," +
            "CASE WHEN :sortMethod='TitleDESC' THEN quoteTitle END DESC, quoteSection ASC," +
            "CASE WHEN :sortMethod='DateASC' THEN createdAt END ASC," +
            "CASE WHEN :sortMethod='DateDESC' THEN createdAt END DESC")
    fun getScoreList(sortMethod : String) : LiveData<List<Score>>
}

인자로 받은 sortMethod에 따라서 ORDER BY가 바뀌게 하는 쿼리를 위와 같이 만들었다.

2. ViewModel

가. Sort 클래스

다음과 같이 sealed class를 만들었다.

sealed class Sort() {
    object TitleASC : Sort()
    object TitleDESC : Sort()
    object DateASC : Sort()
    object DateDESC : Sort()
}

나. ViewModel 함수

각 경우에 따라 Dao를 불러오는 함수를 다음과 같이 만들었다.

    fun scoreList() : LiveData<List<Score>> {
        return scoreDao.getAllScores()
    }
 
    fun scoreList(sortMethod : Sort) : LiveData<List<Score>> {
        return when (sortMethod) {
            Sort.DateASC -> scoreDao.getScoreList("DateASC")
            Sort.DateDESC -> scoreDao.getScoreList("DateDESC")
            Sort.TitleASC -> scoreDao.getScoreList("TitleASC")
            Sort.TitleDESC -> scoreDao.getScoreList("TitleDESC")
        }
    }

3. 불러오기

View화면에서는 다음과 같이 불러오면 된다.

    val sortMethod = remember { mutableStateOf<Sort>(Sort.TitleASC) }
 
    val scoreList by viewModel.scoreList(sortMethod.value).observeAsState() // 점수 목록
 
 
    OrderButtons(sortByTitleASC = { sortMethod.value = Sort.TitleASC },
        sortByTitleDESC = { sortMethod.value = Sort.TitleDESC},
        sortByDateASC =  { sortMethod.value = Sort.DateASC }       )
로그인하면 댓글을 남길 수 있습니다.

android/queriedlist.txt · 마지막으로 수정됨: 2025/04/21 01:06 저자 이거니맨