我有一个sqlite数据库,我想使用room更改主键。要做的是,我创建一个新表,将数据从旧表复制到新表,删除旧表,然后将新表重命名为旧桌子。 这是我的迁移代码:
private val MIGRATION_5_6: Migration = object : Migration(5, 6) {
override fun migrate(database: SupportSQLiteDatabase) {
//Change the SpeechToTextResult primaryKeys
database.execSQL("""
CREATE TABLE `SpeechToTextResult_copy` (
`source` TEXT NOT NULL,
`startTime` REAL NOT NULL,
`endTime` REAL NOT NULL,
`language` TEXT NOT NULL DEFAULT '',
`computeFileIndex` INTEGER NOT NULL,
`projectId` TEXT NOT NULL DEFAULT '',
`wordResults` TEXT NOT NULL,
`computeFileId` INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (`language`, `projectId`, `computeFileId`)
);
""".trimIndent())
database.execSQL("""
INSERT INTO `SpeechToTextResult_copy` (`source`, `startTime`, `endTime`, `language`, `computeFileIndex`, `projectId`, `wordResults`, `computeFileId`)
SELECT `source`, `startTime`, `endTime`, `language`, `computeFileIndex`, `projectId`, `wordResults`, `computeFileId` FROM `SpeechToTextResult`;
""".trimIndent())
database.execSQL("""
DROP TABLE `SpeechToTextResult`;
""".trimIndent())
database.execSQL("""
ALTER TABLE `SpeechToTextResult_copy` RENAME TO `SpeechToTextResult`;
""".trimIndent())
}
}
我也更改了我的实体:
@Entity(primaryKeys = ["language", "projectId", "computeFileId"])
class SpeechToTextResult constructor(@NonNull var source: String,
@NonNull var startTime: Float,
@NonNull var endTime: Float,
@NonNull var language: String,
@NonNull var computeFileIndex: Int, // index position in the computeFiles List
@NonNull var projectId: String,
@TypeConverters(ListConverters::class)
@NonNull var wordResults: List<WordResult>,
@NonNull var computeFileId: Int // index of the scene
) {
class ListConverters {
@TypeConverter
fun fromWordResultList(value: List<WordResult>): String {
val gson = Gson()
val type = object : TypeToken<List<WordResult>>() {
}.type
return gson.toJson(value, type)
}
@TypeConverter
fun toWordResultsList(list: String): List<WordResult> {
val gson = Gson()
val type = object : TypeToken<List<WordResult>>() {
}.type
return gson.fromJson(list, type)
}
}
}
但是,当我运行我的应用程序时,出现此错误:
2019-08-13 14:34:13.776 19028-19201 / io.kannelle.app.dev E / AndroidRuntime:严重例外:RxCachedThreadScheduler-1 流程:io.kannelle.app.dev,PID:19028 io.reactivex.exceptions.OnErrorNotImplementedException:未处理此异常,原因是缺少 subscription()方法调用。进一步阅读: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.lang.IllegalStateException:迁移未正确处理 SubtitleGeneratedInfo(io.kannelle.sdk.models.SubtitleGeneratedInfo)。 预期: TableInfo {name ='SubtitleGeneratedInfo',columns = {projectId = Column {name ='projectId',type ='TEXT',affinity ='2', notNull = true,primaryKeyPosition = 1},language = Column {name ='language', type ='TEXT',affinity ='2',notNull = true,primaryKeyPosition = 2}}, foreignKeys = [],索引= []} 发现: TableInfo {name ='SubtitleGeneratedInfo',columns = {},foreignKeys = [],indexs = []} ...
我该如何解决此问题?