Не удается удалить столбец SQlite методом (начать транзакцию) - PullRequest
0 голосов
/ 13 января 2019

В базе данных Android Studio SQlite у меня есть таблица "title" с двумя столбцами (name, id), я хочу удалить столбец id, я использовал метод транзакции, но он не работает. После копирования столбца имени в новую таблицу я хочу, чтобы новая таблица имела сам столбец идентификатора.

     try {
            SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("db", MODE_PRIVATE, null);

    sqLiteDatabase.execSQL("BEGIN TRANSACTION");
            sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE t1(name VARCHAR)");
            sqLiteDatabase.execSQL("INSERT INTO t1 SELECT name FROM title");
            sqLiteDatabase.execSQL("DROP TABLE title");
            sqLiteDatabase.execSQL("CREATE TABLE title (name VARCHAR, id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO title SELECT name FROM t1");
            sqLiteDatabase.execSQL("DROP TABLE t1");
    sqLiteDatabase.execSQL("COMMIT");

           } catch (Exception e) {

        }

И я тоже попробовал это

 try {
            SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("db", MODE_PRIVATE, null);

    sqLiteDatabase.execSQL("BEGIN TRANSACTION");
            sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE t1(name VARCHAR,id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO t1 SELECT name FROM title");
            sqLiteDatabase.execSQL("DROP TABLE title");
            sqLiteDatabase.execSQL("CREATE TABLE title (name VARCHAR, id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO title SELECT name,id FROM t1");
            sqLiteDatabase.execSQL("DROP TABLE t1");
    sqLiteDatabase.execSQL("COMMIT");

           } catch (Exception e) {

        }

1 Ответ

0 голосов
/ 13 января 2019

Ваша проблема связана с захваченным исключением: -

SQLiteException: table title has 2 columns but 1 values were supplied (code 1 SQLITE_ERROR): , while compiling: INSERT INTO title SELECT name FROM t1

Т.е. вы не предоставляете значение для столбца id .

Изменить на использование

sqLiteDatabase.execSQL("INSERT INTO title SELECT name, null FROM t1");

или

sqLiteDatabase.execSQL("INSERT INTO title (name) SELECT name FROM t1");
...