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
![]()
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;
- sqlite dosyası oluşturun
- 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