如何更改会议室数据库的主键

时间:2019-08-13 12:47:57

标签: android kotlin android-room

我有一个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 = []}             ...

我该如何解决此问题?

0 个答案:

没有答案