其他分享
首页 > 其他分享> > Android Room:如何迁移列重命名?

Android Room:如何迁移列重命名?

作者:互联网

问题

我的应用崩溃了,因为我没有正确处理迁移.我正在寻找一种迁移表中1列名称的解决方案.

在我的项目中,我有一个名为“ content”的房间表,其Double属性为“ archivedCount”.在该应用程序的最新版本中,仍将属性archivedCount属性重命名为dismissCount,仍为Double类型.

原始内容模型

@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var archiveCount: Double) : Parcelable {...}

新内容模型

@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var dismissCount: Double) : Parcelable {...}

尝试的解决方案

阅读了Google Developer Advocate的解释Understanding migrations with Room后,我尝试了在帖子的“迁移具有复杂的架构更改”部分中概述的解决方案,其中包括更改原始表,删除旧表,然后重命名新创建的表.

使用下面的以下方法,在此行上出现运行时错误:database.execSQL(“ INSERT INTO content_new(id,dismissCount)SELECT id,archiveCount FROM users”);因为我已经清除了应用程序的缓存,所以旧表不再存在.

是否可以在不重新创建整个表的情况下更新单个列?

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
    // Create the new table
    database.execSQL(
            "CREATE TABLE content_new (id TEXT, dismissCount REAL, PRIMARY KEY(id))");
    // Copy the data
    database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM users");
    // Remove the old table
    database.execSQL("DROP TABLE content");
    // Change the table name to the correct one
    database.execSQL("ALTER TABLE content_new RENAME TO content");
  }
};

解决方法:

感谢@TimBiegeleisen的指导,我们发现API 27和28的Android implementation of SQLite 3.19尚未升级到版本3.25 SQLite,该功能允许在此StackOverflow post中概述此功能.

Android升级后,将可以使用诸如此类的命令来更改表列:database.execSQL(“ ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount”)

标签:android-room,android-sqlite,sql,android
来源: https://codeday.me/bug/20191025/1924700.html