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