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: String6)78@Dao9interface UserDao {10@Query("SELECT * FROM users")11suspend fun getAllUsers(): List<User>1213@Query("SELECT * FROM users WHERE id =:userId")14suspend fun getUserById(userId: Int): User1516@Insert17suspend 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:
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)78fun 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.
0 yorum