Room veritabanınızı önceden doldurma

Bazen uygulamanızın halihazırda halihazırda bulunan bir veritabanıyla belirli bir veri kümesiyle yüklenir. Buna veritabanı önceden doldurma adı verilir. Oda 2.2.0 ve sonraki sürümlerde, Oda veritabanını önceden doldurmak için API yöntemlerini kullanabilirsiniz veritabanındaki önceden paketlenmiş bir veritabanı dosyasındaki içeriklerle başlatma sırasında dosya sistemidir.

Bir uygulama öğesinden önceden doldurma

Oda veritabanını, aynı konumda bulunan önceden paketlenmiş bir veritabanı dosyasından uygulamanızın assets/ dizininde herhangi bir yerdeyken createFromAsset() yöntemini çağırın yöntemini build() çağırmadan önce RoomDatabase.Builder nesnenizden uygulayın:

Kotlin

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build()

Java

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build();

createFromAsset() yöntemi, assets/ dizininden önceden paketlenmiş veritabanı dosyasına göreli yol.

Dosya sisteminden önceden doldurma

Oda veritabanını, aynı konumda bulunan önceden paketlenmiş bir veritabanı dosyasından uygulamanızın assets/ dizini haricinde, cihazın dosya sisteminde herhangi bir yer, RoomDatabase.Builder nesnenizden createFromFile() yöntemini çağırın build() numaralı telefonu aramadan önce:

Kotlin

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromFile(File("mypath"))
    .build()

Java

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromFile(new File("mypath"))
    .build();

createFromFile() yöntemi,File önceden paketlenmiş veritabanı dosyasıdır. Oda, belirlenen dosyanın bir kopyasını oluşturur açmak yerine doğrudan açabilirsiniz. Bu nedenle, dosyası olarak kaydedebilirsiniz.

Önceden paketlenmiş veritabanları içeren taşıma işlemlerini yönetme

Önceden paketlenmiş veritabanı dosyaları, Oda veritabanınızın işlenme şeklini de değiştirebilir yedek taşıma işlemleri. Normalde yıkıcı taşıma işlemleri etkinleştirildiğinde Oda, taşıma işlemini gerçekleştirmeden gerçekleştirmeli yolu varsa Oda, veritabanındaki tüm tabloları bırakır ve hedef sürüm için belirtilen şemayı oluşturur. Ancak, bir hedef sürümle aynı numaraya sahip, Odadaki önceden paketlenmiş veritabanı dosyası yeniden oluşturulan veritabanını gerçekleştirildikten sonra önceden paketlenmiş veritabanı dosyasıyla

Oda veritabanı taşıma işlemleri hakkında daha fazla bilgi için bkz. Odayı Taşıma veri tabanları.

Aşağıdaki bölümlerde bu sürecin pratikteki işleyişine dair birkaç örnek verilmektedir.

Örnek: Önceden paketlenmiş bir veritabanıyla yedek taşıma

Aşağıdakilerin geçerli olduğunu varsayalım:

  • Uygulamanız sürüm 3'te bir Oda veritabanı tanımlıyor.
  • Cihazda yüklü olan veritabanı örneği sürüm 2'de bulunuyor.
  • Sürüm 3'te önceden paketlenmiş bir veritabanı dosyası mevcut.
  • Sürüm 2'den sürüm 3'e uygulanan bir taşıma yolu mevcut değildir.
  • Zararlı taşıma işlemleri etkin.

Kotlin

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build()

Java

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build();

Bu durumda neler olur?

  1. Çünkü uygulamanızda tanımlanan veritabanı, sürüm 3'te ve veritabanında örneği sürüm 2'de ise taşıma işlemi gerekir.
  2. Sürüm 2'den sürüm 3'e uygulanmış bir taşıma planı olmadığından taşıma işlemi bir yedek taşımadır.
  3. Çünkü fallbackToDestructiveMigration() oluşturucu yöntemi taşıması yıkıcıdır. Oda, veritabanını bırakır örneği olabilir.
  4. Sürüm 3'te önceden paketlenmiş bir veritabanı dosyası bulunduğu için Oda veritabanını yeniden oluşturur ve önceden paketlenmiş veritabanı dosyası olarak kullanabilirsiniz. Öte yandan, önceden paketlediğiniz veritabanı dosyası sürüm 2'yi seçerseniz Oda, hedef sürümle eşleşmediğini ve taşıma işleminin bir parçası olarak kullanmaz.

Örnek: Önceden paketlenmiş bir veritabanıyla uygulanan taşıma

Bunun yerine, uygulamanızın sürüm 2'den sürüm 3:

Kotlin

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 2 to version 3.
val MIGRATION_2_3 = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build()

Java

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 2 to version 3.
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build();

Bu durumda neler olur?

  1. Çünkü uygulamanızda tanımlanan veritabanı, sürüm 3'te ve veritabanında 2. sürümde yüklüyse taşıma gerekir.
  2. Sürüm 2'den sürüm 3'e uygulanan bir taşıma yolu olduğundan, Oda, veritabanını güncellemek için tanımlı migrate() yöntemini çalıştırır cihazdaki örneği sürüm 3'e yükseltmeye kontrol eder. Oda, önceden paketlenmiş veritabanı dosyasını kullanmıyor çünkü Oda , yalnızca yedek taşıma durumunda önceden paketlenmiş veritabanı dosyaları kullanır.

Örnek: Önceden paketlenmiş bir veritabanıyla çok adımlı taşıma

Önceden paketlenmiş veritabanı dosyaları, birden çok dosyadan oluşan taşıma işlemlerini de etkileyebilir. adım. Aşağıdaki durumu göz önünde bulundurun:

  • Uygulamanız sürüm 4'te bir Oda veritabanı tanımlıyor.
  • Cihazda yüklü olan veritabanı örneği sürüm 2'de bulunuyor.
  • Sürüm 3'te önceden paketlenmiş bir veritabanı dosyası mevcut.
  • Sürüm 3'ten sürüm 4'e uygulanan bir taşıma yolu var, ancak sürüm 2'den sürüm 3'e.
  • Zararlı taşıma işlemleri etkin.

Kotlin

// Database class definition declaring version 4.
@Database(version = 4)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 3 to version 4.
val MIGRATION_3_4 = object : Migration(3, 4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build()

Java

// Database class definition declaring version 4.
@Database(version = 4)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 3 to version 4.
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build();

Bu durumda neler olur?

  1. Çünkü uygulamanızda tanımlanan veritabanı sürüm 4'te ve veritabanında örneği sürüm 2'de ise taşıma işlemi gerekir.
  2. Sürüm 2'den sürüm 3'e uygulanmış bir taşıma yolu olmadığından taşıma işlemi bir yedek taşımadır.
  3. Çünkü fallbackToDestructiveMigration() oluşturucu yöntemi taşıması yıkıcıdır. Oda, veritabanını bırakır ekleyebilirsiniz.
  4. Sürüm 3'te önceden paketlenmiş bir veritabanı dosyası bulunduğu için Oda veritabanını yeniden oluşturur ve önceden paketlenmiş veritabanı dosyası olarak kullanabilirsiniz.
  5. Cihazda yüklü veritabanı artık sürüm 3'tedir. Çünkü bu yine de uygulamanızda tanımlanan sürümden düşükse gerekir.
  6. Sürüm 3'ten sürüm 4'e uygulanan bir taşıma yolu olduğundan, Oda, veritabanını güncellemek için tanımlı migrate() yöntemini çalıştırır cihazdaki örneği sürüm 4'e kopyalaması gereken, kopyalanan verileri yeni bir sürüm oluşturabilirsiniz.

Ek kaynaklar

Room veritabanını önceden doldurma hakkında daha fazla bilgi için aşağıdaki ek kaynaklar.

Videolar

Bloglar