ALTER TABLE doesn't work as expected in some cases

Viewed 96

While implementing migration if a select(SELECT * FROM user) query is made before adding column(ALTER TABLE user ADD COLUMN simple_name TEXT) then the subsequent select(SELECT * FROM user) query doesn't show the newly added column

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()
        }
    }
}

Running MIGRATION_1_2 prints the following

D/MIGRATION_1_2: migrate: running select before ALTER
D/MIGRATION_1_2: migrate: columns before ALTER [id, account_id, username, email]
D/MIGRATION_1_2: migrate: executed ALTER TABLE user ADD COLUMN phone TEXT DEFAULT '' NOT NULL
D/MIGRATION_1_2: migrate: running select after ALTER
D/MIGRATION_1_2: migrate: columns after ALTER [id, account_id, username, email]
E/MIGRATION_1_2: migrate: ALTER didn't work, phone column not added
D/MIGRATION_1_2: migrate: running select again after ALTER
D/MIGRATION_1_2: migrate: columns now [id, account_id, username, email, phone]
E/MIGRATION_1_2: migrate: ALTER worked after second SELECT query

1 Answers
Related