当我尝试在表中添加新列时房间不起作用迁移



添加新的迁移后,我有下一个异常。我没有做什么?当我调试时,迁移已经完成。新列是文本,我尝试在一个单元格中写入所有数据。

java.lang.IllegalStateException: Pre-packaged database has an invalid schema: library(com.tnco.runar.model.LibraryItemsModel).
Expected:
TableInfo{name='library', columns={audio_duration=Column{name='audio_duration', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, rune_tags=Column{name='rune_tags', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, image_url=Column{name='image_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, link_url=Column{name='link_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, link_title=Column{name='link_title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, audio_url=Column{name='audio_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, title=Column{name='title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, type=Column{name='type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, childs=Column{name='childs', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, sort_order=Column{name='sort_order', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, content=Column{name='content', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='library', columns={audio_duration=Column{name='audio_duration', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, image_url=Column{name='image_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, link_url=Column{name='link_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, link_title=Column{name='link_title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, audio_url=Column{name='audio_url', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, title=Column{name='title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, type=Column{name='type', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, childs=Column{name='childs', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, sort_order=Column{name='sort_order', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, content=Column{name='content', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}

应为:rune_tags=列BUT未找到

我的数据库类:

@Database(entities = [LibraryItemsModel::class, ...],
version = 4,
exportSchema = false)
abstract class AppDB : RoomDatabase() {
abstract fun appDAO(): AppDAO
companion object {
@Volatile
private lateinit var INSTANCE: AppDB
fun init(context: Context) {
var dataBaseFilePath = "database/layouts.db"

INSTANCE = Room.databaseBuilder(context, AppDB::class.java, "EN_DATABASE")
.createFromAsset(dataBaseFilePath)
.addMigrations(MIGRATION_2_3, MIGRATION_3_4)
.build()
}
fun getLayoutDB(): AppDB {
return INSTANCE
}

private val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE runes_generator (id INTEGER PRIMARY KEY NOT NULL, imgUrl TEXT, enTitle TEXT, ruTitle TEXT)")
}
}

private val MIGRATION_3_4 = object : Migration(3, 4) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE library ADD COLUMN rune_tags TEXT")
}
}

型号类别:

@Entity(tableName = "library")
@TypeConverters(LibraryConverter::class)
data class LibraryItemsModel(
@PrimaryKey
var id: String,
var childs: List<String>?,
var content: String?,
var title: String?,
@ColumnInfo(name = "image_url")
var imageUrl: String?,
@ColumnInfo(name = "sort_order")
var sortOrder: Int?,
var type: String?,
@ColumnInfo(name = "link_title")
var linkTitle: String?,
@ColumnInfo(name = "link_url")
var linkUrl: String?,
@ColumnInfo(name = "audio_url")
var audioUrl: String?,
@ColumnInfo(name = "audio_duration")
var audioDuration: Int?,
@ColumnInfo(name = "rune_tags")
var runeTags: List<String>?
) {
constructor() : this(
"null",
listOf(),
null,
null,
null,
null,
null,
null,
null,
null,
null,
listOf()
)
}

我添加了@ColumnInfo(名称="rune_tags"(var runeTags:List?

我也有转换器类

class LibraryConverter {
@TypeConverter
fun fromList(items: List<String>?): String? {
return items?.stream()?.collect(Collectors.joining("|"))
}
@TypeConverter
fun toList(data: String?): List<String> {
return data?.split("|") ?: listOf()
}

}

您的问题是预打包数据库(资产(不包括架构更改(如果我记得正确的话,它不是版本3(,并且该数据库在设备上不存在(因此该数据库是从资产/预打包数据库复制的(。

因此,预打包的数据库正在被复制,然后它的版本被设置为,或者已经处于版本4,因此不进行迁移,从而产生消息:-

预打包数据库。。。。

为了满足新安装的需要,您需要/应该使用当前架构预打包数据库。

或者,您可以使用PrePackagedDatabaseCallback来更改表。您可能会发现如何使用Room的预打包数据库回调?有用的

  • 建议您更改预打包的数据库,而不是使用回调,因为您总是在进行一次更改。
    • 如果您有一个始终处于原始状态的预打包数据库。然后,您必须确保当前更改的逻辑考虑了以前的更改,而不仅仅考虑了最近的更改。
      • 因此,如果遵循渐进式预打包数据库原则,对预打包数据的更改可以测试大部分(如果不是全部的话(拟议的迁移
      • 如果不遵循这一原则,那么迁移和回调过程可能会有所不同,两者都不完全是对另一个的测试

最新更新