SQLite'den Odaya taşıma

Room kalıcılık kitaplığı, SQLite API'lerini doğrudan kullanmaya kıyasla çeşitli avantajlar sunar:

  • SQL sorgularının derleme zamanında doğrulanması
  • Tekrarlanan ve hataya açık ortak metin kodunu en aza indiren kolaylık notları
  • Kolaylaştırılmış veritabanı taşıma yolları

Uygulamanızda Room olmayan bir SQLite uygulaması varsa Room'a nasıl geçeceğinizi öğrenmek için bu sayfayı inceleyin. Room, uygulamanızdaki ilk SQLite uygulamasıysa temel kullanım için Room kullanarak verileri yerel bir veritabanına kaydetme başlıklı makaleyi inceleyin.

Taşıma adımları

SQLite uygulamanızı Room'a taşımak için aşağıdaki adımları uygulayın. SQLite uygulamanızda büyük bir veritabanı veya karmaşık sorgular kullanılıyorsa Room'a kademeli olarak geçiş yapmayı tercih edebilirsiniz. Artımlı taşıma stratejisi hakkında daha fazla bilgi için Artımlı taşıma başlıklı makaleyi inceleyin.

Bağımlılıkları güncelleme

Uygulamanızda Room'u kullanmak için uygulamanızın build.gradle dosyasına uygun bağımlılıkları eklemeniz gerekir. Oda bağımlılıkları hakkında daha fazla bilgi için Kurulum başlıklı makaleyi inceleyin.

Model sınıflarını veri varlıklarına güncelleme

Room, veritabanındaki tabloları temsil etmek için veri öğelerini kullanır. Her varlık sınıfı bir tabloyu temsil eder ve bu tablodaki sütunları temsil eden özelliklere sahiptir. Mevcut model sınıflarınızı Room varlıkları olarak güncellemek için aşağıdaki adımları uygulayın:

  1. Sınıf bildirimini @Entity ile açıklama ekleyerek bunun bir oda öğesi olduğunu belirtin. İsteğe bağlı olarak tableName özelliğini kullanarak sonuç tablosunun sınıf adından farklı bir ada sahip olması gerektiğini belirtebilirsiniz.
  2. Birincil anahtar özelliğini @PrimaryKey ile açıklama ekleyin.
  3. Elde edilen tablodaki sütunlardan herhangi birinin, ilgili özelliğin adından farklı bir adı olması durumunda özelliği @ColumnInfo ile açıklama ekleyin ve name özelliğini doğru sütun adına ayarlayın.
  4. Sınıfta veritabanında kalıcı olmasını istemediğiniz özellikler varsa Room'un ilgili tabloda bu özellikler için sütun oluşturmaması gerektiğini belirtmek üzere bu özellikleri @Ignore ile açıklama ekleyin.
  5. Sınıfta birden fazla oluşturucu varsa diğer tüm oluşturucuları @Ignore ile açıklama ekleyerek Room'un hangi oluşturucuyu kullanması gerektiğini belirtin.

@Entity(tableName = "users")
data class User(
    @PrimaryKey @ColumnInfo(name = "userid") val id: String,
    @ColumnInfo(name = "username") val userName: String?,
    @ColumnInfo(name = "last_update") val date: Date?,
)

DAO oluşturma

Room, veritabanına erişen işlevleri tanımlamak için veri erişim nesnelerini (DAO'lar) kullanır. Mevcut sorgu işlevlerinizi DAO'larla değiştirmek için Room DAO'larını kullanarak verilere erişme bölümündeki yönergeleri uygulayın.

Veritabanı sınıfı oluşturma

Room uygulamaları, veritabanı örneğini yönetmek için bir veritabanı sınıfı kullanır. Veritabanı sınıfınız RoomDatabase'ı genişletmeli ve tanımladığınız tüm varlıklara ve DAO'lara referans vermelidir.

@Database(entities = [User::class], version = 2)
@ColumnTypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Taşıma yolu tanımlama

Veritabanı sürüm numarası değiştiğinden mevcut veritabanı verilerini korumak için bir Migration nesnesi tanımlamanız gerekir. Veritabanı şeması değişmezse bu taşıma boş olabilir.

val MIGRATION_1_2 = object : Migration(1, 2) {
    override suspend fun migrate(connection: SQLiteConnection) {
        // Empty implementation, because the schema isn't changing.
    }
}

Room'daki veritabanı taşıma yolları hakkında daha fazla bilgi için Veritabanınızı taşıma başlıklı makaleyi inceleyin.

Veritabanı örneğini güncelleme

Bir veritabanı sınıfı ve taşıma yolu tanımladıktan sonra, taşıma yolu uygulanmış veritabanınızın bir örneğini oluşturmak için Room.databaseBuilder aracını kullanabilirsiniz:

val db =
    Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name")
        .addMigrations(MIGRATION_1_2)
        .build()

Uygulamanızı test etme

Yeni oda uygulamanızı test ettiğinizden emin olun:

Aşamalı taşıma

Uygulamanız büyük ve karmaşık bir veritabanı kullanıyorsa uygulamanızı Room'a tek seferde taşımak mümkün olmayabilir. Bunun yerine, ilk adım olarak isteğe bağlı şekilde veri öğelerini ve Room veritabanını uygulayabilir, ardından sorgu işlevlerinizi daha sonra DAO'lara taşıyabilirsiniz.

Artımlı taşıma uygulamak için androidx.room3:room3-sqlite-wrapper yapısından roomDatabase.getSupportWrapper uzantı işlevini kullanarak SupportSQLiteDatabase uyumluluk sarmalayıcısı edinin. Bu sarmalayıcı, Android SQLite API'lerini kullanarak Room tarafından yönetilen veritabanında doğrudan Android tarzı SQL sorguları yürütmenize olanak tanır:

// Get SupportSQLiteDatabase wrapper
val legacyDb = roomDatabase.getSupportWrapper()
legacyDb.execSQL("INSERT INTO users ...")