房间数据库迁移没有正确处理转换
Room Database Migration didn't properly handle conversion
我正在尝试从 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,它只涉及:
- 正在重命名 table
- 添加新列。
所以,标准的(也许是唯一的)方法是
- 创建具有所需架构的临时 table
- 将旧 table 中的所有数据复制到新 table
- 删除旧的table
- 将新 table 重命名为所需名称
所有这些代码都将出现在您将提供给房间的迁移的 migrate
函数中。
Room 1.1 添加了对 Room 中没有的 Sqlite 类型的支持,从而解决了除主键之外的所有问题。最终解决问题的是一个迁移,花了很多工作,但这里是最终解决的代码,如果其他人有这个问题:
override fun migrate(database: SupportSQLiteDatabase) {
//Creates table named conversation_temp with copy of table from before, and adds a PRIMARY KEY AUTO INCREMENT to that
database.execSQL(TexpertDatabase.CONVO_CREATE)
database.execSQL("INSERT (column, names, listed) INTO conversation_temp SELECT * FROM conversation")
database.execSQL("DROP TABLE conversation")
database.execSQL("ALTER TABLE conversation_temp RENAME TO conversation")
}
我正在尝试从 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,它只涉及:
- 正在重命名 table
- 添加新列。
所以,标准的(也许是唯一的)方法是
- 创建具有所需架构的临时 table
- 将旧 table 中的所有数据复制到新 table
- 删除旧的table
- 将新 table 重命名为所需名称
所有这些代码都将出现在您将提供给房间的迁移的 migrate
函数中。
Room 1.1 添加了对 Room 中没有的 Sqlite 类型的支持,从而解决了除主键之外的所有问题。最终解决问题的是一个迁移,花了很多工作,但这里是最终解决的代码,如果其他人有这个问题:
override fun migrate(database: SupportSQLiteDatabase) {
//Creates table named conversation_temp with copy of table from before, and adds a PRIMARY KEY AUTO INCREMENT to that
database.execSQL(TexpertDatabase.CONVO_CREATE)
database.execSQL("INSERT (column, names, listed) INTO conversation_temp SELECT * FROM conversation")
database.execSQL("DROP TABLE conversation")
database.execSQL("ALTER TABLE conversation_temp RENAME TO conversation")
}