android:collection:search
search
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판 | |||
android:collection:search [2025/05/12 00:27] – 검색 결과 하이라이트 이거니맨 | android:collection:search [2025/06/03 18:22] (현재) – SQL 검색 이거니맨 | ||
---|---|---|---|
줄 219: | 줄 219: | ||
} | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Roomdatabase에서 검색하기 ===== | ||
+ | |||
+ | ==== 1. Dao 만들기 ==== | ||
+ | |||
+ | Dao에서 SQL문은 다음과 같이 작성하면 된다. | ||
+ | |||
+ | <code kotlin> | ||
+ | @Query(" | ||
+ | "WHERE (CASE WHEN :isFiltered = 1 THEN (quoteTitle LIKE :title AND speechResult LIKE ' | ||
+ | "ORDER BY " + | ||
+ | "CASE WHEN : | ||
+ | "CASE WHEN : | ||
+ | "CASE WHEN : | ||
+ | "CASE WHEN : | ||
+ | "CASE WHEN : | ||
+ | "CASE WHEN : | ||
+ | |||
+ | ) | ||
+ | fun getScoreList(sortMethod : String, isFiltered : Boolean, title : String, search : String) : LiveData< | ||
+ | </ | ||
+ | |||
+ | 일부 단어 포함(위의 Collection 기능에서 contains 함수)을 하려면 SQL 문에서 ' | ||
+ | |||
+ | 그런데 Kotlin문에서 이를 표시하면 concatrate연산자 ' | ||
+ | |||
+ | LIKE ' | ||
+ | | ||
+ | |||
+ | ==== 2. ViewModel 만들기 ==== | ||
+ | |||
+ | ViewModel은 다음과 같이 하면 된다. | ||
+ | |||
+ | <code kotlin> | ||
+ | fun scoreList(sortMethod : Sort, isFiltered : Boolean, filter : String, search : String) : LiveData< | ||
+ | return when (sortMethod) { | ||
+ | Sort.DateASC -> scoreDao.getScoreList(" | ||
+ | Sort.DateDESC -> scoreDao.getScoreList(" | ||
+ | Sort.TitleASC -> scoreDao.getScoreList(" | ||
+ | Sort.TitleDESC -> scoreDao.getScoreList(" | ||
+ | Sort.ScoreASC -> scoreDao.getScoreList(" | ||
+ | Sort.ScoreDESC -> scoreDao.getScoreList(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 3. Compose View화면 ==== | ||
+ | |||
+ | View 화면에서는 다음과 같이 뷰모델을 호출한다. | ||
+ | |||
+ | <code kotlin> | ||
+ | // 검색어 | ||
+ | var searchString by remember { mutableStateOf("" | ||
+ | |||
+ | val scoreList by viewModel.scoreList(sortMethod.value, | ||
+ | | ||
+ | // 검색 창 | ||
+ | Row(modifier = Modifier | ||
+ | .fillMaxWidth() | ||
+ | .padding(6.dp), | ||
+ | |||
+ | OutlinedTextField( | ||
+ | value = searchString, | ||
+ | onValueChange = { searchString = it }, | ||
+ | label = { Text(text = " | ||
+ | trailingIcon = { | ||
+ | IconButton(onClick = { searchString = "" | ||
+ | Icon( | ||
+ | imageVector = Icons.Default.Close, | ||
+ | contentDescription = " | ||
+ | ) | ||
+ | } | ||
+ | }, | ||
+ | textStyle = TextStyle(fontFamily = fontkjcMyungjo, | ||
+ | keyboardOptions = KeyboardOptions.Default, | ||
+ | ) | ||
+ | } | ||
+ | | ||
+ | |||
+ | // 연락처 리스트 | ||
+ | scoreList? | ||
+ | |||
+ | // 자세히 버튼 | ||
+ | // val completeQuote by remember { mutableStateOf(doneList? | ||
+ | // val done by remember { mutableStateOf(completeQuote? | ||
+ | val completeQuote = doneList? | ||
+ | val done = completeQuote? | ||
+ | |||
+ | |||
+ | if (!done || !isFiltered) { | ||
+ | ScoreItemCard(item = item, onDelete = {viewModel.deleteScore(item)}, | ||
+ | onComplete = { | ||
+ | if (completeQuote != null) { | ||
+ | completeQuote.isDone = false; | ||
+ | viewModel.upsertDone(completeQuote) | ||
+ | } | ||
+ | }, | ||
+ | onUnComplete = { | ||
+ | if (completeQuote != null) { | ||
+ | completeQuote.isDone = true; | ||
+ | viewModel.upsertDone(completeQuote) | ||
+ | }else { | ||
+ | val tempComplete = DoneList( | ||
+ | quoteID = item.quoteID, | ||
+ | isDone = false, | ||
+ | completeDate = Date.from(Instant.now()), | ||
+ | ext1 = "" | ||
+ | ) | ||
+ | viewModel.upsertDone(tempComplete) | ||
+ | } | ||
+ | }, isDone = done) | ||
+ | } | ||
+ | }?: Text( | ||
+ | modifier = Modifier.fillMaxWidth(), | ||
+ | textAlign = TextAlign.Center, | ||
+ | text = "No items yet", | ||
+ | fontSize = 16.sp | ||
+ | ) | ||
</ | </ |
android/collection/search.1746977221.txt.gz · 마지막으로 수정됨: 저자 이거니맨