Jetpack Compose Room Kullanımı: Room Database

Bu yazımda, kotlinde room veritabanının kullanımı göstereceğim. Room, Google I/O 2016’da sunulan Android Architecture Components’ın bir parçasıdır. SQLite veritabanlarını daha kolay oluşturmamıza ve işlememize izin veren, ek açıklamaları kullanarak veritabanlarımızı, tablolarını tanımlayabileceğimiz basit bir kütüphanedir.

Room Mimarisi

roomDatabase

Room’un üç ana bileşeni;

  • Database: SQLite DB ile bağlantısı olan ve tüm işlemlerin yürütüldüğü bir db sınıfıdır.. @Database
  • Entity: Veritabanındaki tabloları temsil eder. @Entity
  • DAO:  Uygulamanızın veritabanındaki verileri sorgulamak, güncellemek, eklemek ve silmek için kullanabileceği fonksiyonlar sağlar.. @Dao

Başlamadan önce;

  1. sqlite dosyası oluşturun
  2. Projenizin app dizininde assets klasörü oluşturup içine yükleyin

Örnek Room Veritabanı

#1  buid.gradle dosyasında dependencies bloguna gerekli kütüphaneleri ekliyoruz.

dependencies {
  def room_version = "2.2.6"

    //LiveData
    implementation "androidx.compose.runtime:runtime-livedata:1.0.0-beta08"

    //Room
    implementation "androidx.room:room-runtime:2.4.0-rc01"
    kapt "androidx.room:room-compiler:2.4.0-rc01"
    //Coroutine
    implementation "androidx.room:room-ktx:2.4.0-rc01"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"

}

Ayrıca build.gradle dosyasına aşağıdaki eklentiyi eklememiz gerekmektedir.

apply plugin: 'kotlin-kapt'

Room kütüphanesini projemize dahil ettik şimdi verileri depolayabileceğimiz bir tablo oluşturacağız.

#2 data sınıfı oluşturuyoruz. ( User )

@Entity(tableName = "user")
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "firstName") val firstName: String?,
    @ColumnInfo(name = "surName") val surName: String?
) {
}

Entity,  Room veritabanındaki bir tablodur.  Yukarıdaki kodda User (tablo adı, data class adıyla aynı olacak) adında bir tablo oluşturduk ve bu tablo 3 alana sahiptir.(kullanıcı ıd (Birincil anahtar olacak), firstname ve surname.)

#3 Arayüz oluşturuyoruz. ( UserDao )

@Dao
interface UserDao {
    @Query("SELECT * FROM User")
    suspend fun getAllUser(): List<User>
    
    @Insert
    suspend fun insert(user:User)   
    
    @Delete
    suspend fun delete(user:User)

}

@Dao kullanılacak veritabanı metotlarını temsil eder,

  • Query, özel sorgular yazmak için kullanılır. (Tüm User bilgilerini okumak gibi.)
  • Insert,Delete ekleme ve silme işlemlerini gerçekleştirir.

#4 Veritabanı oluşturuyoruz. ( UserDb )

@Database(entities = [User::class], version = 1)
abstract class UserDb: RoomDatabase() {
    abstract fun UserDao(): UserDao
    companion object {
         private var INSTANCE: UserDb? = null
         fun getInstance(context: Context): UserDb{
            synchronized(this) {
                var instance = INSTANCE
                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDb::class.java,
                        "user.sqlite"
                    ).createFromAsset("user.sqlite").build()
               }
             return INSTANCE
           }
       }
   }
}

#5 Repository oluşturuyoruz. ( UserRepo )

UserDao’yu yapıcı parametresi olarak alan bir repo sınıfı ( UserRepo ) oluşturuyoruz.

class UserDao(var application: Application) {
    var userList= MutableLiveData<List<User>>()
    var db: UserDb

    init {
        db = Db.getInstance(application)!!
        userList= MutableLiveData()
    }

    fun getUsers(): MutableLiveData<List<User>> {
        return userList
    }

    fun getAllUser() {
        val job: Job = CoroutineScope(Dispatchers.Main).launch {
            userList.value = db.UserDao().getAllUser()
        }
    }

    fun addUser(firstName: String, surName: String) {
        val job: Job = CoroutineScope(Dispatchers.Main).launch {
            val newUser= User(0, firstName, surName)
            db.UserDao().insert(newUser)
        }
    }

    fun deleteUser(uid: Int) {
        val job: Job = CoroutineScope(Dispatchers.Main).launch {
            val deletedUser = User(uid, "", "", "")
            db.UserDao().delete(deletedUser )
            getAllUser()
        }
    }


}
  • Veritabanıyla tüm etkileşimler bu repo katmanı aracılığıyla yapılır.

Örnek projeyi github hesabımdan indirip inceleyebilirsiniz. IBANsfer-with-kotlin

Yorum Yap