Room'u kullanarak verileri yerel bir veritabanına kaydedin Android Jetpack'in bir parçasıdır.

Önemsiz miktarda yapılandırılmış veri işleyen uygulamalar, bu verileri yerel olarak saklamaktan büyük fayda sağlayabilir. En yaygın kullanım durumu, cihaz ağa erişemediğinde bile kullanıcının bu içeriğe çevrimdışıyken de göz atabilmesi için alakalı veri parçalarını önbelleğe almaktır.

Oda kalıcılık kitaplığı, SQLite üzerinde bir soyutlama katmanı sağlar. Bu sayede, SQLite'ın tüm gücünden yararlanırken veritabanına akıcı bir şekilde erişim sağlayabilirsiniz. Room, özellikle aşağıdaki avantajları sağlar:

  • SQL sorgularını derleme sırasında doğrulama.
  • Tekrarlayan ve hataya açık standart kodları en aza indiren kullanışlı ek açıklamalar.
  • Basitleştirilmiş veritabanı taşıma yolları.

Bu nedenle, SQLite API'lerini doğrudan kullanmak yerine Room'u kullanmanızı önemle tavsiye ederiz.

Kurulum

Uygulamanızda Room'u kullanmak için aşağıdaki bağımlılıkları uygulamanızın build.gradle dosyasına ekleyin:

Modern

dependencies {
    def room_version = "2.6.1"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:$room_version"
}

Kotlin

dependencies {
    val room_version = "2.6.1"

    implementation("androidx.room:room-runtime:$room_version")
    annotationProcessor("androidx.room:room-compiler:$room_version")

    // To use Kotlin annotation processing tool (kapt)
    kapt("androidx.room:room-compiler:$room_version")
    // To use Kotlin Symbol Processing (KSP)
    ksp("androidx.room:room-compiler:$room_version")

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")

    // optional - RxJava2 support for Room
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:$room_version")
}

Birincil bileşenler

Odada üç ana bileşen vardır:

  • Veritabanını barındıran ve uygulamanızın kalıcı verilerine giden temel bağlantı için ana erişim noktası görevi gören veritabanı sınıfı.
  • Uygulamanızın veritabanındaki tabloları temsil eden veri varlıkları.
  • Uygulamanızın veritabanındaki verileri sorgulamak, güncellemek, eklemek ve silmek için kullanabileceği yöntemler sunan veri erişim nesneleri (DAO'lar).

Veritabanı sınıfı, uygulamanıza bu veritabanıyla ilişkilendirilmiş DAO'ların örneklerini sağlar. Buna karşılık uygulama, ilişkili veri varlığı nesnelerinin örnekleri olarak veritabanından veri almak için DAO'ları kullanabilir. Uygulama, tanımlanan veri varlıklarını kullanarak ilgili tablolardaki satırları güncelleyebilir veya ekleme amacıyla yeni satırlar oluşturabilir. Şekil 1'de Oda'nın farklı bileşenleri arasındaki ilişki gösterilmektedir.

Şekil 1. Oda kitaplığı mimarisi şeması.

Örnek uygulama

Bu bölümde, tek bir veri varlığı ve tek bir DAO ile Room veritabanının örnek uygulaması gösterilmektedir.

Veri varlığı

Aşağıdaki kod bir User veri varlığını tanımlar. Her User örneği, uygulamanın veritabanındaki user tablosundaki bir satırı temsil eder.

Kotlin

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

Java

@Entity
public class User {
    @PrimaryKey
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Odadaki veri varlıkları hakkında daha fazla bilgi edinmek için Oda varlıklarını kullanarak verileri tanımlama konusuna bakın.

Veri erişim 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ığı yöntemleri sağlar.

Kotlin

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

Java

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

DAO'lar hakkında daha fazla bilgi edinmek için Oda DAO'larını kullanarak verilere erişme bölümüne bakın.

Veritabanı

Aşağıdaki kod, veritabanını barındıracak bir AppDatabase sınıfı tanımlar. AppDatabase, veritabanı yapılandırmasını tanımlar ve uygulamanın kalıcı verilere erişim noktası olarak işlev görür. Veritabanı sınıfı aşağıdaki koşulları karşılamalıdır:

  • Sınıfa, veritabanıyla ilişkilendirilmiş tüm veri varlıklarını listeleyen bir entities dizisi içeren @Database ek açıklaması eklenmelidir.
  • Sınıf, RoomDatabase aralığını genişleten soyut bir sınıf olmalıdır.
  • Veritabanı sınıfı, veritabanıyla ilişkilendirilen her DAO sınıfı için sıfır bağımsız değişkeni olan ve DAO sınıfının bir örneğini döndüren soyut bir yöntem tanımlamalıdır.

Kotlin

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Java

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

Not: Uygulamanız tek bir işlemde çalışıyorsa bir AppDatabase nesnesini somutlaştırırken tekil tasarım kalıbını izlemeniz gerekir. Her RoomDatabase örneği oldukça pahalıdır ve tek bir işlemde birden fazla örneğe nadiren erişmeniz gerekir.

Uygulamanız birden fazla işlemde çalışıyorsa veritabanı oluşturucu çağrınıza enableMultiInstanceInvalidation() ekleyin. Bu şekilde, her işlemde bir AppDatabase örneğiniz olduğunda, paylaşılan veritabanı dosyasını bir işlemde geçersiz kılabilirsiniz. Bu geçersiz kılma işlemi de otomatik olarak diğer işlemler içindeki AppDatabase örneklerine uygulanır.

Kullanım

Veri varlığını, DAO'yu ve veritabanı nesnesini tanımladıktan sonra aşağıdaki kodu kullanarak veritabanının bir örneğini oluşturabilirsiniz:

Kotlin

val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()

Java

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();

Daha sonra, DAO'nun bir örneğini almak için AppDatabase öğesindeki soyut yöntemleri kullanabilirsiniz. Buna karşılık, veritabanıyla etkileşim kurmak için DAO örneğindeki yöntemleri kullanabilirsiniz:

Kotlin

val userDao = db.userDao()
val users: List<User> = userDao.getAll()

Java

UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

Ek kaynaklar

Oda hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:

Sana Özel

Codelab uygulamaları

Bloglar