我正在嘗試對我的資料庫執行遷移。
我試圖添加的表如下:
@Entity(tableName = "Recipe_Of_Day_Entity")
data class RecipeOfDayDTO(
@PrimaryKey
@ColumnInfo(name = "id")
val id : String = UUID.randomUUID().toString(),
@ColumnInfo(name = "vegetarian")
val vegetarian: Boolean,
@ColumnInfo(name = "vegan")
val vegan: Boolean,
@ColumnInfo(name = "glutenFree")
val glutenFree: Boolean,
@ColumnInfo(name = "dairyFree")
val dairyFree: Boolean,
@ColumnInfo(name = "veryHealthy")
val veryHealthy: Boolean,
@ColumnInfo(name = "image")
val image: String?,
@ColumnInfo(name = "imageType")
val imageType: String?,
@ColumnInfo(name = "instructions")
val instructions: String?)
遷移物件定義如下:
val MIGRATION_4_5: Migration = object : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) {
// https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo
database.execSQL("CREATE TABLE IF NOT EXISTS `RecipeOfDayDTO` (`id` TEXT NOT NULL, `vegetarian` "
"INTEGER NOT NULL, `vegan` INTEGER NOT NULL, `glutenFree` INTEGER NOT NULL, `dairyFree` INTEGER NOT NULL,"
"`veryHealthy` INTEGER NOT NULL, `image` TEXT NOT NULL, `imageType` TEXT NOT NULL, `instructions` TEXT NOT NULL)")
}
}
我正在構建資料庫如下:
@Database(entities = [IngredientDataClassDTO::class, RecipeNotificationClassDTO::class, RecipeOfDayDTO::class], version = 5, exportSchema = true)
abstract class IngredientDatabase : RoomDatabase() {
.
.
.
Room.databaseBuilder(
context.applicationContext,
IngredientDatabase::class.java,
"saved_ingredient_database"
)
// https://medium.com/androiddevelopers/understanding-migrations-with-room-f01e04b07929
.addMigrations(MIGRATION_4_5)
.build()
我已經確保預期和找到的表之間沒有差異,如
我不想破壞我以前的資料庫,所以我避免使用 fallbackToDestructiveMigration()。Invalidating & Restarting 沒有消除錯誤。有沒有其他人遇到過這個問題?
uj5u.com熱心網友回復:
RecipeOfDayDTO.image, RecipeOfDayDTO.imageType,RecipeOfDayDTO.instructions是可為空的String,所以你的遷移SQL一定是這樣的;
database.execSQL("CREATE TABLE IF NOT EXISTS `RecipeOfDayDTO` (`id` TEXT NOT NULL, `vegetarian` "
"INTEGER NOT NULL, `vegan` INTEGER NOT NULL, `glutenFree` INTEGER NOT NULL, `dairyFree` INTEGER NOT NULL,"
"`veryHealthy` INTEGER NOT NULL, `image` TEXT NULL, `imageType` TEXT NULL, `instructions` TEXT NULL)")```
uj5u.com熱心網友回復:
匹配預期和發現的方法是對用 注釋的類進行更改@Entity,確保該類被定義為@Database 類的物體串列中的物體,然后編譯(CTRL F9)和然后檢查生成的java(通過Android View)。
您查看與使用 @Database 注釋的類同名但后綴為 _Impl 的類,以及createAllTables具有 Room 期望每個表的 SQL 的命名方法。然后為新表復制相應的 SQL 是一件簡單的事情。對于其他更改,例如更改表,您可以將結果表/列基于在生成的 java.sql 中找到的 SQL。
例如,將 RecipeOfDayDTO 添加到現有專案,然后將其添加到 @Database 類
導致在生成的 java 中找到以下方法:-
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `NoteEntity` (`id` INTEGER, `startRef` INTEGER NOT NULL, `endRef` INTEGER NOT NULL, `content` TEXT NOT NULL, PRIMARY KEY(`id`))");
_db.execSQL("CREATE TABLE IF NOT EXISTS `Recipe_Of_Day_Entity` (`id` TEXT NOT NULL, `vegetarian` INTEGER NOT NULL, `vegan` INTEGER NOT NULL, `glutenFree` INTEGER NOT NULL, `dairyFree` INTEGER NOT NULL, `veryHealthy` INTEGER NOT NULL, `image` TEXT, `imageType` TEXT, `instructions` TEXT, PRIMARY KEY(`id`))");
_db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
_db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c8707866be882430083eee62243a71ed')");
}
所以這只是復制 SQL 的問題:-
"CREATE TABLE IF NOT EXISTS `Recipe_Of_Day_Entity` (`id` TEXT NOT NULL, `vegetarian` INTEGER NOT NULL, `vegan` INTEGER NOT NULL, `glutenFree` INTEGER NOT NULL, `dairyFree` INTEGER NOT NULL, `veryHealthy` INTEGER NOT NULL, `image` TEXT, `imageType` TEXT, `instructions` TEXT, PRIMARY KEY(`id`))"
進入遷移,無需花時間試圖確定哪些匹配和不匹配。
在 2.4.0-aplh01 及更高版本中,Room 還支持自動遷移(可以輕松處理添加表)。但是,它們依賴于 exportSchema 選項為真,并且這種模式存在于之前和之后的版本中。
見https://developer.android.com/training/data-storage/room/migrating-db-versions
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388566.html
標籤:安卓 科特林 android-room 数据库迁移
