从 SQLite 迁移到 Room:迁移没有正确处理 table
Migrating from SQLite to Room: Migration didn't properly handle table
所以我使用的是 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,
)
这是我用来创建 table BEFORE 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)"
此外,我创建了一个新的迁移到数据库的最终版本,它使用了我留空的房间,因为我不想在 table.
中更改任何内容
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.
Expected: TableInfo{name='documents', columns={path=Column{name='path', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found: TableInfo{name='documents', columns={path=Column{name='path', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='LONG', affinity='1', notNull=false, primaryKeyPosition=0, defaultValue='9223372036854775807'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
路径和文件名字段的类型有所不同,预期为TEXT,但实际上是STRING和也是 dateCreated 的类型,它应该是 INTEGER 但实际上是 LONG。对我来说有趣的部分是 dateCreated 很久以前就属于类型,现在仍然是 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 database迁移代码的时候,String要用TEXT,long数据要用INTEGER。
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")
}
}
}
所以我使用的是 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,
)
这是我用来创建 table BEFORE 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)"
此外,我创建了一个新的迁移到数据库的最终版本,它使用了我留空的房间,因为我不想在 table.
中更改任何内容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.
Expected: TableInfo{name='documents', columns={path=Column{name='path', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found: TableInfo{name='documents', columns={path=Column{name='path', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='LONG', affinity='1', notNull=false, primaryKeyPosition=0, defaultValue='9223372036854775807'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
路径和文件名字段的类型有所不同,预期为TEXT,但实际上是STRING和也是 dateCreated 的类型,它应该是 INTEGER 但实际上是 LONG。对我来说有趣的部分是 dateCreated 很久以前就属于类型,现在仍然是 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 database迁移代码的时候,String要用TEXT,long数据要用INTEGER。
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")
}
}
}