Oda yok DEĞİL en azından kadar olmaz, bir iyi Göç Sistemi var 2.1.0-alpha03.
Bu nedenle, daha iyi bir Geçiş Sistemine sahip olana kadar, Odada kolay Geçişlere sahip olmak için bazı geçici çözümler vardır.
@Database(createNewTables = true) Ya MigrationSystem.createTable(User::class)da diye bir yöntem olmadığından, biri ya da diğeri olması gerektiği için, mümkün olan tek yol koşmaktır.
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
migrateyönteminizin içinde .
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
SQL betiğinin üzerine çıkmak için 4 yolunuz var
1. Kendi kendinize yazın
Temel olarak, yukarıdaki betiği Room'un oluşturduğu betiğe uyacak şekilde yazmanız gerekir. Bu yol mümkün, mümkün değil. (50 alanınız olduğunu düşünün)
2. Şemayı Dışa Aktar
Ek açıklamanızın exportSchema = trueiçine eklerseniz @Database, Room proje klasörünüzün / şemaları içinde veritabanı şeması oluşturacaktır. Kullanım
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
}
build.gradeUygulama modülünüze aşağıdaki satırları eklediğinizden emin olun
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Projeyi çalıştırdığınızda veya 2.jsonoluşturduğunuzda, Oda veritabanınızdaki tüm sorguları içeren bir JSON dosyası alacaksınız .
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
Böylece yukarıdakileri createSqlkendi migrateyönteminize dahil edebilirsiniz .
3. AppDatabase_Impl'den sorgu alın
Şemayı dışa aktarmak istemiyorsanız, AppDatabase_Impl.javadosyayı oluşturacak projeyi çalıştırarak veya oluşturarak sorguyu yine de alabilirsiniz . ve belirtilen dosya içinde sahip olabilirsiniz.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
createAllTablesYöntem içinde , tüm varlıkların oluşturma komut dosyaları olacaktır. Onu alabilir ve kendi migrateyönteminize dahil edebilirsiniz.
4. Ek Açıklama İşleme.
Tahmin edebileceğiniz gibi, Oda yukarıda belirtilenlerin tümünü schemave AppDatabase_Impldosyaları derleme süresi içinde ve eklediğiniz Ek Açıklama İşleme ile oluşturur.
kapt "androidx.room:room-compiler:$room_version"
Bu, sizin için gerekli tüm sorguları oluşturan kendi ek açıklama işleme kitaplığınızı da yapabileceğiniz anlamına gelir.
Fikir Odası ait ek açıklamalar için bir açıklama işleme kütüphanesi yapmaktır @Entityve @Database. Örneğin not alan bir sınıfı ele @Entityalalım. Bunlar takip etmeniz gereken adımlar
- Yeni bir tane oluşturun
StringBuilderve "MEVCUT DEĞİLSE TABLO OLUŞTUR" seçeneğini ekleyin
- Tablo adını alanından
class.simplenameveya tableNamealanına göre alın @Entity. EkleyinStringBuilder
- Daha sonra sınıfınızın her alanı için SQL sütunları oluşturun. Alanın adını, türünü, boş verilebilirliğini ya alanın kendisine göre ya da
@ColumnInfoek açıklama ile alın. Her alan için, id INTEGER NOT NULLbir sütun stilini StringBuilder.
- Birincil anahtarları şu şekilde ekleyin:
@PrimaryKey
- Varsa
ForeignKeyve ekleyin Indices.
- Bitirdikten sonra onu dizeye dönüştürün ve kullanmak istediğiniz yeni bir sınıfa kaydedin. Örneğin, aşağıdaki gibi kaydedin
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
O zaman bunu şu şekilde kullanabilirsiniz:
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
Kendime öyle bir kitaplık yaptım ki siz de inceleyebilir, hatta projenizde kullanabilirsiniz. Yaptığım kitaplığın dolu olmadığını ve sadece tablo oluşturma gereksinimlerimi karşıladığını unutmayın.
Daha iyi Geçiş için RoomExtension
RoomExtension kullanan uygulama
Umarım yararlı olmuştur.
GÜNCELLEME
Bu cevabı yazdığım zaman, oda versiyonu öyleydi 2.1.0-alpha03ve geliştiricilere e-posta gönderdiğimde bir yanıt aldım
Daha iyi bir Göç Sistemine sahip olması beklenmektedir. 2.2.0
Ne yazık ki, hala daha iyi bir Göç Sisteminden yoksun.