我有一个表Server
@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列(用户名,密码)从帐户转移到服务器,然后从帐户中删除它们。我编写了Migrations,但是我看到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")
}
答案 0 :(得分:5)
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;
答案 1 :(得分:2)
这是前两个答案的组合,用 Kotlin for Android 编写:
private val MIGRATION_3_2 = object : Migration(3,2) {
override fun migrate(database: SupportSQLiteDatabase) {
//Drop column isn't supported by SQLite, so the data must manually be moved
with(database) {
execSQL("CREATE TABLE Users_Backup (id INTEGER, name TEXT, PRIMARY KEY (id))")
execSQL("INSERT INTO Users_Backup SELECT id, name FROM Users")
execSQL("DROP TABLE Users")
execSQL("ALTER TABLE Users_Backup RENAME to Users")
}
}
}