===== 참고할 기초지식 ===== 데이터를 쿼리하여 정렬하는 것은 관련 UI도 매우 중요하다. UI를 참조할 수 있는 샘플은 구글에서 제공하는 [[https://developer.android.com/develop/ui/compose/lists?hl=ko|목록 및 그리드]]에 대한 [[https://github.com/android/snippets/blob/d68fdfb1aef23b977360432c83150d8e34a00e97/compose/snippets/src/main/java/com/example/compose/snippets/lists/AnimatedOrderedList.kt|스니펫 모음]]을 참고하자. 매우 잘 되어 있다. ===== List 내장 함수를 이용하여 데이터를 다루는 방법 ===== 위 [[https://github.com/android/snippets/blob/d68fdfb1aef23b977360432c83150d8e34a00e97/compose/snippets/src/main/java/com/example/compose/snippets/lists/AnimatedOrderedList.kt|스니펫 모음]] 예제를 보면 kotlin으로 데이터를 어떻게 다루는지 이해하기가 쉽다. 데이터베이스가 없는 경우에 데이터를 다루는 예제이므로 일어보면 도움이 된다. class AnimatedOrderedListViewModel : ViewModel() { private val _data = listOf("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten") private val _displayedItems: MutableStateFlow> = MutableStateFlow(_data) val displayedItems: StateFlow> = _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는 이렇게 만들 수 있을 것이다. 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> @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> } 인자로 받은 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> { return scoreDao.getAllScores() } fun scoreList(sortMethod : Sort) : LiveData> { 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.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 } )