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`))
migrate
yö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 = true
iç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.grade
Uygulama 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.json
oluş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 createSql
kendi migrate
yönteminize dahil edebilirsiniz .
3. AppDatabase_Impl'den sorgu alın
Şemayı dışa aktarmak istemiyorsanız, AppDatabase_Impl.java
dosyayı 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`))");
createAllTables
Yöntem içinde , tüm varlıkların oluşturma komut dosyaları olacaktır. Onu alabilir ve kendi migrate
yönteminize dahil edebilirsiniz.
4. Ek Açıklama İşleme.
Tahmin edebileceğiniz gibi, Oda yukarıda belirtilenlerin tümünü schema
ve AppDatabase_Impl
dosyaları 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 @Entity
ve @Database
. Örneğin not alan bir sınıfı ele @Entity
alalım. Bunlar takip etmeniz gereken adımlar
- Yeni bir tane oluşturun
StringBuilder
ve "MEVCUT DEĞİLSE TABLO OLUŞTUR" seçeneğini ekleyin
- Tablo adını alanından
class.simplename
veya tableName
alanı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
@ColumnInfo
ek açıklama ile alın. Her alan için, id INTEGER NOT NULL
bir sütun stilini StringBuilder
.
- Birincil anahtarları şu şekilde ekleyin:
@PrimaryKey
- Varsa
ForeignKey
ve 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-alpha03
ve 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.