Room Database: SQLite Sorgularını Coroutine'lerle Optimize Etme

Room Database kullanırken ana iş parçacığında veritabanı sorgusu çalıştırırsan uygulamanız donup kilitlenir. Coroutine'ler bu sorunu zarif biçimde çözer, sorguları arka planda çalıştırıp sonuçları UI'a geri döndürür.

Temel sorun şu: Room sorgularını varsayılan olarak ana thread'de yapmaya izin vermez. Eski yöntemi (AsyncTask, Thread) kullanırsan kod karmaşık ve hata eğilimli olur. Coroutine'ler ise senkron gibi görünen ama asenkron çalışan kod yazmanı sağlar.

İlk adım, Entity ve DAO'nu tanımlamak:

1@Entity(tableName = "users")
2data class User(
3@PrimaryKey val id: Int,
4val name: String,
5val email: String
6)
7
9interface UserDao {
10@Query("SELECT * FROM users")
11suspend fun getAllUsers(): List<User>
12
13@Query("SELECT * FROM users WHERE id =:userId")
14suspend fun getUserById(userId: Int): User
15
17suspend fun insertUser(user: User)
18}

Suspend anahtar kelimesi, bu fonksiyonların coroutine içinde çalışabileceğini Room'a söyler. Şimdi Repository katmanında işleri yönetebilirsin:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1class UserRepository(private val userDao: UserDao) {
2fun getAllUsers(): Flow<List<User>> = flow {
3emit(userDao.getAllUsers())
4}.flowOn(Dispatchers.IO)
5}

Flow kullanmak, veritabanı değişikliklerini otomatik olarak UI'a yansıtır. ViewModel'de bunu dinle:

1class UserViewModel(private val repository: UserRepository): ViewModel() {
2val users = repository.getAllUsers().stateIn(
3scope = viewModelScope,
4started = SharingStarted.Lazily,
5initialValue = emptyList()
6)
7
8fun addUser(user: User) {
9viewModelScope.launch {
10repository.insertUser(user)
11}
12}
13}

UI katmanında (Fragment/Activity):

1lifecycleScope.launch {
2repeatOnLifecycle(Lifecycle.State.STARTED) {
3viewModel.users.collect { userList ->
4adapter.submitList(userList)
5}
6}
7}

Sık hata: Dispatcher belirtmeden Flow yazmak. IO işlemleri mutlaka `Dispatchers.IO` üzerinde çalışmalı, UI güncellemeleri `Dispatchers.Main` (varsayılan) üzerinde kalmalı. Coroutine'ler bunu otomatik yönetir ama `flowOn()` ile açıkça kontrol etmen iyi pratiktir.

Bu yapı ile sorguların ana thread'i bloklaması durur, uygulamanız pürüzüsüz kalır ve kod okunması kolay olur.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz