android-studio - Drop column Room迁移android

标签 android-studio kotlin migration android-room

我有一个表服务器

@Entity(tableName = "servers")
data class ServerDto(

    @PrimaryKey
    @ColumnInfo(name = "server_id")
    var serverId: Long,

    @ColumnInfo(name = "address", defaultValue = "")
    var serverAddress: String,

    @ColumnInfo(name = "description", defaultValue = "")
    var serverDescription: String,

    @ColumnInfo(name = "file_segment")
    var fileSegment: Int

) : Serializable

和一个表帐户
@Entity(tableName = "accounts", primaryKeys = ["server_id", "account_id"])
data class AccountDto(

    @ColumnInfo(name = "server_id")
    val serverId: Long,

    @ColumnInfo(name = "account_id")
    val accountId: Int,

  @ColumnInfo(name = "username", defaultValue = "")
    val username: String,

    @ColumnInfo(name = "password", defaultValue = "")
    val password: String,

    @ColumnInfo(name = "first_name", defaultValue = "")
    var firstname: String,

    @ColumnInfo(name = "last_name", defaultValue = "")
    var lastname: String,

    @ColumnInfo(name = "email", defaultValue = "")
    var email: String,

    @ColumnInfo(name = "active")
    var active: Int

) : Serializable

我想将 2 列(用户名、密码)从帐户传输到服务器,然后从帐户中删除它们。我写了迁移,但我看到 Android Studio 不允许写 DROP COLUMN,因为它用红色下划线。那有什么问题??
override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE servers ADD COLUMN username VARCHAR")
        database.execSQL("ALTER TABLE servers ADD COLUMN password VARCHAR")
        database.execSQL("UPDATE servers SET username = (SELECT a.username FROM accounts a where a.server_id = servers.server_id and a.active = 1)")
        database.execSQL("UPDATE servers SET password = (SELECT a.password FROM accounts a where a.server_id = servers.server_id and a.active = 1)")
        database.execSQL("ALTER TABLE accounts ***DROP*** COLUMN username")
        database.execSQL("ALTER TABLE accounts ***DROP*** COLUMN password")
    }

最佳答案

SQLite 不支持立即删除列。
您必须执行以下迁移步骤:
来源:https://www.sqlite.org/faq.html#q11

CREATE TABLE accounts_backup(serverId VARCHAR, accountId VARCHAR, firstname VARCHAR, lastname VARCHAR, email VARCHAR, active VARCHAR);

INSERT INTO accounts_backup SELECT serverId, accountId, firstname, lastname, email, active FROM accounts;

DROP TABLE accounts;

CREATE TABLE accounts(serverId VARCHAR, accountId VARCHAR, firstname VARCHAR, lastname VARCHAR, email VARCHAR, active VARCHAR);

INSERT INTO accounts SELECT serverId, accountId, firstname, lastname, email, active FROM accounts_backup;

DROP TABLE accounts_backup;

关于android-studio - Drop column Room迁移android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012776/

相关文章:

configuration - 在 IIS 中的 ISAPI 筛选器上调用 LoadLibraryEx

android - 底部工作表不显示所有布局

java - ListFragment 更改尺寸

kotlin - 获取价格的应用内结算库

jboss - 迁移到 JBoss 5.1 - 无法创建新的 SAX 解析器

php - Laravel 表间迁移引用

android - 获取按钮 ID 而不是整个按钮

android-studio - Android emulator - dummy emulator-5554 和 AVD ... 已经在运行

android - Jetpack Compose 在方向更改时保存状态

java - 在 Kotlin 函数类型中表达 "super"泛型?