【发布时间】:2021-06-15 10:06:19
【问题描述】:
在实现迁移时,如果在添加列之前进行了 select(SELECT * FROM user) 查询(ALTER TABLE user ADD COLUMN simple_name TEXT),那么后续的 select(SELECT * FROM user) 查询不会显示新添加的列
val MIGRATION_1_2: Migration = object : Migration(1, 2) {
val TAG = "MIGRATION_1_2"
@SuppressLint("LogNotTimber")
override fun migrate(database: SupportSQLiteDatabase) {
var c: Cursor? = null
try {
Log.d(TAG, "migrate: running select before ALTER")
c = database.query("SELECT * FROM user")
Log.d(TAG, "migrate: columns before ALTER ${Arrays.toString(c.columnNames)}")
while (c.moveToNext()) {
}
} finally {
c?.close()
}
database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT DEFAULT '' NOT NULL")
Log.d(TAG, "migrate: executed ALTER TABLE user ADD COLUMN phone TEXT DEFAULT '' NOT NULL")
try {
Log.d(TAG, "migrate: running select after ALTER")
c = database.query("SELECT * FROM user")
Log.d(TAG, "migrate: columns after ALTER ${Arrays.toString(c.columnNames)}")
if (!c.columnNames.contains("phone")) {
Log.e(TAG, "migrate: ALTER didn't work, phone column not added")
}
while (c.moveToNext()) {
}
} finally {
c?.close()
}
try {
Log.d(TAG, "migrate: running select again after ALTER")
c = database.query("SELECT * FROM user")
Log.d(TAG, "migrate: columns now ${Arrays.toString(c.columnNames)}")
if (c.columnNames.contains("phone")) {
Log.e(TAG, "migrate: ALTER worked after second SELECT query")
}
while (c.moveToNext()) {
}
} finally {
c?.close()
}
}
}
运行 MIGRATION_1_2 打印以下内容
D/MIGRATION_1_2:迁移:在 ALTER 之前运行选择
D/MIGRATION_1_2:迁移:ALTER 之前的列 [id、account_id、用户名、电子邮件]
D/MIGRATION_1_2:迁移:执行 ALTER TABLE 用户 ADD COLUMN phone TEXT DEFAULT '' NOT NULL
D/MIGRATION_1_2:迁移:在 ALTER 之后运行选择
D/MIGRATION_1_2:迁移:ALTER 之后的列 [id、account_id、用户名、电子邮件]
E/MIGRATION_1_2:迁移:ALTER 不起作用,未添加电话列
D/MIGRATION_1_2:迁移:在 ALTER 之后再次运行选择
D/MIGRATION_1_2:迁移:列现在 [id、account_id、用户名、电子邮件、电话]
E/MIGRATION_1_2:迁移:ALTER 在第二次 SELECT 查询后工作
【问题讨论】:
标签: android sqlite android-room