Моя комната Дао
Код: Выделить всё
@Dao
interface ContactDao {
@Insert
fun insertAll(vararg contacts: Contact)
@Query("SELECT * FROM contact WHERE id=:id")
fun getById(id: Int): Contact?
@Query("SELECT * FROM contact WHERE number=:number")
fun getByNumber(number: String): Contact?
@Query(
"""
SELECT
contact.id,
contact.name,
contact.number,
MAX(contact_message.message_time) AS latest_message_time,
COUNT(contact_message.id) as messages_count,
contact_message.message_body as latest_message_body
FROM
contact
INNER JOIN
contact_message
ON
contact_message.contact_id = contact.id
GROUP BY
contact.id
ORDER BY
latest_message_time DESC;
"""
)
fun getAll(): List
@Query(
"""
SELECT
contact.id,
contact.name,
contact.number,
MAX(contact_message.message_time) AS latest_message_time,
COUNT(contact_message.id) as messages_count,
contact_message.message_body as latest_message_body
FROM
contact
INNER JOIN
contact_message
ON
contact_message.contact_id = contact.id
GROUP BY
contact.id
ORDER BY
latest_message_time DESC;
"""
)
fun getAllWithPagination(): PagingSource
}
Код: Выделить всё
class SomeClass {
@ExperimentalPagingApi
fun getAllContactsPager(): Flow
> {
return Pager(
config = PagingConfig(pageSize = 20),
) {
db.contactDao().getAllWithPagination()
}.flow.cachedIn(viewModelScope)
}
}
Код: Выделить всё
@OptIn(ExperimentalPagingApi::class)
@Composable
fun ContactsList(vm: SmsViewModel = viewModel()) {
val pager = vm.getAllContactsPager().collectAsLazyPagingItems()
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(
count = pager.itemCount
) { index ->
val item = pager[index]
item?.let {
ContactBasicInfoCard(vm = vm, contactWithCount = item)
}
}
}
}
Я пытался сделать все вручную, и это вообще не сработало
Подробнее здесь: https://stackoverflow.com/questions/792 ... -any-thing
Мобильная версия