我正在尝试从 Sqlite 迁移到 Room,但出现迁移错误,我相信这是因为我使用了 VARCHAR()(我遵循了指南,绝对希望我只使用 TEXT,但是现在无法修复)。
这是我的实体:
@Entity(tableName = "conversation")
class Conversation(@PrimaryKey
@ColumnInfo(name = "key") val key: Int,
@ColumnInfo(name = "message_id") val messageId: String?,
@ColumnInfo(name = "thread_id") val threadId: String?,
@ColumnInfo(name = "address") val address: String?,
@ColumnInfo(name = "group_address") val groupAddress: String?,
@ColumnInfo(name = "name") val name: String?,
@ColumnInfo(name = "group_name") val groupName: String?,
@ColumnInfo(name = "body") val body: String?)
这是我遇到的错误:
Expected:
TableInfo{name='conversation', columns={date=Column{name='date', type='INTEGER', notNull=false, primaryKeyPosition=0}, address=Column{name='address', type='TEXT', notNull=false, primaryKeyPosition=0}.....
Found:
TableInfo{name='conversation', columns={date=Column{name='date', type='INTEGER', notNull=false, primaryKeyPosition=0}, address=Column{name='address', type='VARCHAR(14)', notNull=false, primaryKeyPosition=0}....
这只是一大堆,我不太确定如何将 VARCHAR 转换为文本或类似的东西
编辑:迁移方法
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(TexpertDatabase.CONVO_CREATE) //Creates table named conversation_temp with preferred schema
database.execSQL("INSERT INTO conversation_temp SELECT ${TexpertDatabase.allCols} FROM conversation")
database.execSQL("DROP TABLE conversation")
database.execSQL("ALTER TABLE conversation_temp RENAME TO conversation")
}
最佳答案
通常,关系型数据库提供ALTER TABLE
命令,允许您更改列的数据类型。但遗憾的是,SQLite 提供了一个 very limited ALTER TABLE
support ,其中仅涉及:
- 重命名表
- 添加新列。
所以,标准的(也许是唯一的)方法是
- 使用所需的模式创建一个临时表
- 将旧表中的所有数据复制到新表中
- 删除旧表
- 将新表重命名为所需的名称
所有这些代码都将出现在您将提供给房间的迁移的 migrate
函数中。
关于android - 房间数据库迁移没有正确处理转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082785/