android - 房间数据库迁移没有正确处理转换

标签 android android-room

我正在尝试从 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 ,其中仅涉及:

  • 重命名表
  • 添加新列。

所以,标准的(也许是唯一的)方法是

  1. 使用所需的模式创建一个临时表
  2. 将旧表中的所有数据复制到新表中
  3. 删除旧表
  4. 将新表重命名为所需的名称

所有这些代码都将出现在您将提供给房间的迁移的 migrate 函数中。

关于android - 房间数据库迁移没有正确处理转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082785/

相关文章:

android - 如何将 SurfaceTexture 保存为位图

android - Room 和 rxjava 数据库不工作?

android - 将 Kotlin 内联类作为实体字段的房间数据库

android - 我在尝试使用 Room 数据库时收到此错误消息

android - Google Analytics(GA)在Android上使用简单的参数发送调用不会在仪表板上显示结果

Android 相机 Intent 不返回/锁定

java - 使用 RxJava 嵌套网络请求

Android Studio 无法解析自定义项目布局中的 androidTestImplementation 依赖项

android - 这是 LiveData 的正确使用方式吗?

android - withContext(Dispatchers.IO) 如何用于房间