Room kullanarak verileri yerel veritabanına kaydetme Android Jetpack'in bir parçasıdır.
Önemli miktarda yapılandırılmış veriyi işleyen uygulamalar, bu verileri yerel olarak kalıcı hale getirmekten büyük ölçüde yararlanabilir. En yaygın kullanım alanı, verilerin ilgili parçalarını önbelleğe almaktır. Böylece cihaz ağa erişemediğinde kullanıcılarınız çevrimdışı durumdayken bu içeriğe göz atmaya devam edebilir.
Room kalıcılık kitaplığı, SQLite'in tüm gücünden yararlanırken akıcı veritabanı erişimine olanak tanımak için SQLite üzerinde bir soyutlama katmanı sağlar. Özellikle Room aşağıdaki avantajları sunar:
- SQL sorgularının derleme zamanında doğrulanması.
- Tekrara kaçan ve hataya açık ortak metin kodunu en aza indiren kolaylık notları.
- Kolaylaştırılmış veritabanı taşıma yolları.
SQLite API'lerini doğrudan kullanmak yerine Room'u kullanmanızı öneririz.
Kurulum
Uygulamanızda Room'u kullanmak için modülünüzün build.gradle.kts dosyasına aşağıdaki bağımlılıkları ekleyin. Room 3.0, ek açıklama işleme için KSP gerektirir.
Kotlin
dependencies { val room_version = "3.0.0" implementation("androidx.room3:room3-runtime:$room_version") ksp("androidx.room3:room3-compiler:$room_version") }
Groovy
dependencies { def room_version = "3.0.0" implementation "androidx.room3:room3-runtime:$room_version" ksp "androidx.room3:room3-compiler:$room_version" }
Birincil bileşenler
Oda'da üç ana bileşen bulunur:
- Veritabanını tutan ve uygulamanızın kalıcı verilerine yönelik temel bağlantı için ana erişim noktası olarak hizmet veren veritabanı sınıfı.
- Uygulamanızın veritabanındaki tabloları temsil eden veri öğeleri.
- Uygulamanızın veritabanındaki verileri sorgulamak, güncellemek, eklemek ve silmek için kullanabileceği işlevler sağlayan veri erişim nesneleri (DAO'lar).
Veritabanı sınıfı, uygulamanıza bu veritabanıyla ilişkili DAO örneklerini sağlar. Buna karşılık uygulama, veritabanından veri almak için DAO'ları kullanabilir. Bu veriler, ilişkili veri varlığı nesnelerinin örnekleri olarak alınır. Uygulama, tanımlanan veri öğelerini ilgili tablolardaki satırları güncellemek veya eklemek için yeni satırlar oluşturmak üzere de kullanabilir. Şekil 1'de Room'un farklı bileşenleri arasındaki ilişki gösterilmektedir.
Örnek uygulama
Bu bölümde, tek bir veri varlığı ve tek bir DAO içeren bir Room veritabanının örnek uygulaması sunulmaktadır.
Veri varlığı
Aşağıdaki kod, User veri varlığını tanımlar. User
öğesinin her örneği, uygulamanın veritabanındaki bir user tablosunda bir satırı temsil eder.
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String )
Room'daki veri varlıkları hakkında daha fazla bilgi edinmek için Room varlıklarını kullanarak verileri tanımlama başlıklı makaleyi inceleyin.
Veri erişimi nesnesi (DAO)
Aşağıdaki kod, UserDao adlı bir DAO'yu tanımlar. UserDao, uygulamanın geri kalanının user tablosundaki verilerle etkileşim kurmak için kullandığı işlevleri sağlar.
@Dao interface UserDao { @Query("SELECT * FROM user") suspend fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") suspend fun loadAllByIds(userIds: IntArray): List<User> @Query( """ SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1 """ ) suspend fun findByName(first: String, last: String): User @Insert suspend fun insertAll(vararg users: User) @Delete suspend fun delete(user: User) }
DAO'lar hakkında daha fazla bilgi edinmek için Room DAO'larını kullanarak verilere erişme başlıklı makaleyi inceleyin.
Veritabanı
Aşağıdaki kod, veritabanını tutacak bir AppDatabase sınıfı tanımlar.
AppDatabase, veritabanı yapılandırmasını tanımlar ve kalıcı verilere erişmek için uygulamanın ana erişim noktası olarak kullanılır. Veritabanı sınıfı aşağıdaki koşulları karşılamalıdır:
- Sınıf, veritabanıyla ilişkili tüm veri varlıklarını listeleyen bir
entitiesdizisi içeren@Databaseek açıklamasıyla açıklanmalıdır. - Sınıf,
RoomDatabaseöğesini genişleten bir soyut sınıf olmalıdır. - Veritabanıyla ilişkili her DAO sınıfı için veritabanı sınıfı, herhangi bir bağımsız değişken almayan ve DAO sınıfının bir örneğini döndüren soyut bir işlev tanımlamalıdır.
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Not: Uygulamanız tek bir işlemde çalışıyorsa AppDatabase
nesnesi oluştururken tekil tasarım kalıbını kullanmanız gerekir. Her RoomDatabase örneği oldukça pahalıdır ve tek bir işlemde birden fazla örneğe erişmeniz nadiren gerekir.
Uygulamanız birden fazla işlemde çalışıyorsa veritabanı oluşturucu çağrınıza enableMultiInstanceInvalidation() ekleyin. Bu sayede, her işlemde AppDatabase
örneğiniz olduğunda paylaşılan veritabanı dosyasını bir işlemde geçersiz kılabilirsiniz.
Bu geçersiz kılma işlemi, diğer işlemlerdeki AppDatabase örneklerine otomatik olarak yayılır.
Kullanım
Veri varlığını, DAO'yu ve veritabanı nesnesini tanımladıktan sonra veritabanının bir örneğini oluşturmak için aşağıdaki kodu kullanabilirsiniz:
val db = Room.databaseBuilder<AppDatabase>(applicationContext, "database-name") .setDriver(AndroidSQLiteDriver()) .build()
Ardından, AppDatabase içindeki soyut işlevleri kullanarak DAO'nun bir örneğini alabilirsiniz. Buna karşılık, veritabanıyla etkileşim kurmak için DAO örneğindeki işlevleri kullanabilirsiniz:
val userDao = db.userDao() val users: List<User> = userDao.getAll()
Ek kaynaklar
Room hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın: