Android 从SQLite迁移到Room:迁移没有';我拿不好桌子

Android 从SQLite迁移到Room:迁移没有';我拿不好桌子,android,database,database-migration,android-room,Android,Database,Database Migration,Android Room,所以我使用的是SQLite数据库,现在我决定将它迁移到Room,而不做任何更改。这就是我的房间模型 @Entity(tableName = "documents") data class Document( @PrimaryKey(autoGenerate = true) val docID: Int, val path: String, val filename: String, val dateCreated: Long = MAX_VALUE, )

所以我使用的是SQLite数据库,现在我决定将它迁移到Room,而不做任何更改。这就是我的房间模型

@Entity(tableName = "documents")
data class Document(
    @PrimaryKey(autoGenerate = true)
    val docID: Int,
    val path: String,
    val filename: String,
    val dateCreated: Long = MAX_VALUE,
)
这是我用来在room之前创建表的查询:

"CREATE TABLE IF NOT EXISTS documents (docID INTEGER PRIMARY KEY ASC, path TEXT NOT NULL unique, filename TEXT NOT NULL, dateCreated LONG DEFAULT MAX_VALUE)"
另外,我创建了一个到数据库最终版本的新迁移,该数据库使用了这个房间,我将它留空,因为我不想更改表中的任何内容

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
    override fun migrate(database: SupportSQLiteDatabase) {

    }
}
因此,当我最终在设备上运行它时(该设备具有数据库的早期(9)版本),会引发一个异常:

java.lang.IllegalStateException: Migration didn't properly handle: documents.
路径字段和文件名字段的类型不同,预期为文本,但实际上为字符串,日期创建的类型也不同,预期为整数,但实际为。对我来说,有趣的是dateCreated早就属于long类型,现在仍然是long类型。我尝试添加迁移,如下所示:

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
    override fun migrate(database: SupportSQLiteDatabase) {
        val tableDocumentsTemp = "documents_temp"
        database.execSQL("ALTER TABLE documents RENAME TO $tableDocumentsTemp")
        database.execSQL("CREATE TABLE documents (docId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, path STRING NOT NULL, filename STRING NOT NULL, dateCreated LONG DEFAULT $MAX_VALUE)")
        database.execSQL("INSERT INTO documents (docId, path, filename, dateCreated) SELECT docId, path, filename, dateCreated FROM $tableDocumentsTemp")
        database.execSQL("DROP TABLE $tableDocumentsTemp")
        }
    }
}
但这没什么区别


有人知道我如何修复它吗?

在编写room数据库迁移代码时,必须使用文本作为字符串,使用整数作为长数据类型

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
override fun migrate(database: SupportSQLiteDatabase) {
    val tableDocumentsTemp = "documents_temp"
    database.execSQL("CREATE TABLE $tableDocumentsTemp (docId INTEGER NOT NULL, path TEXT NOT NULL, filename TEXT NOT NULL, dateCreated INTEGER DEFAULT $MAX_VALUE NOT NULL, PRIMARY KEY(docId))")
    database.execSQL("INSERT INTO $tableDocumentsTemp (docId, path, filename, dateCreated) SELECT docId, path, filename, dateCreated FROM documents")
    database.execSQL("DROP TABLE documents")
    database.execSQL("ALTER TABLE $tableDocumentsTemp RENAME TO documents")
    }
 }
}
private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
override fun migrate(database: SupportSQLiteDatabase) {
    val tableDocumentsTemp = "documents_temp"
    database.execSQL("CREATE TABLE $tableDocumentsTemp (docId INTEGER NOT NULL, path TEXT NOT NULL, filename TEXT NOT NULL, dateCreated INTEGER DEFAULT $MAX_VALUE NOT NULL, PRIMARY KEY(docId))")
    database.execSQL("INSERT INTO $tableDocumentsTemp (docId, path, filename, dateCreated) SELECT docId, path, filename, dateCreated FROM documents")
    database.execSQL("DROP TABLE documents")
    database.execSQL("ALTER TABLE $tableDocumentsTemp RENAME TO documents")
    }
 }
}