Как добавить новый столбец в базу данных Android SQLite?
У меня есть одна проблема с Android
11 ответов:
самый простой способ сделать это добавить
SQL to the onUpgrade()
методSQLiteOpenHelper class
. Что-то вроде:@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // If you need to add a new column if (newVersion > oldVersion) { db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0"); } }
я наткнулся на эту тему, когда мне нужна помощь в моем собственном приложении, но видел проблемы со многими ответами. Я бы рекомендовал сделать следующее:
private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;"; private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;"; @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL(DATABASE_ALTER_TEAM_1); } if (oldVersion < 3) { db.execSQL(DATABASE_ALTER_TEAM_2); } }
вы хотите убедиться, что код будет работать, когда пользователи обновляют более 1 версии и что инструкция update запускает только одно обновление, которое необходимо. Для немного больше об этом, проверьте это блог.
возможно, немного более элегантный подход с использованием switch вместо if / then, который будет обновляться с любой схемы до самой последней схемы...
вот также приличная страница о синтаксисе для изменения таблицы:http://alvinalexander.com/android/sqlite-alter-table-syntax-examples
public static final String TABLE_TEAM = "team"; public static final String COLUMN_COACH = "coach"; public static final String COLUMN_STADIUM = "stadium"; private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;"; private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;"; @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: //upgrade from version 1 to 2 db.execSQL(DATABASE_ALTER_TEAM_TO_V2); case 2: //upgrade from version 2 to 3 db.execSQL(DATABASE_ALTER_TEAM_TO_V3); //and so on.. do not add breaks so that switch will //start at oldVersion, and run straight through to the latest } }
@Aamirkhan.я думаю,что вы бы решили проблему, которую вы упомянули в комментариях давно.я думаю, что вы не увеличили версию базы данных. или же ответы здесь прямолинейны.я пишу это, потому что это может помочь любому, кто не увеличил или не изменил номер версии базы данных при изменении таблицы.
Я думаю, что мы не должны проверять состояние, как это
if (newVersion > oldVersion) { }
потому что если мы используем это, это означает, что каждый раз , когда мы увеличиваем версию базы данных, тогда onUpdrade() вызовет и условие будет истинным, поэтому мы должны проверить это
if(oldVersion==1) { }
поэтому в этом случае, если старая версия равна 2, то условие будет ложным, и пользователь со старой версией 2 не будет обновлять базу данных (которую пользователь хочет только для версии 1), потому что для этих пользователей база данных уже обновлена .
Я сделал следующий подход, он resovled для меня
если версия БД : 6
Ex : There is a table with 5 columns
при обновлении до : 7 ( я добавляю 1 новый столбец 3 таблицы)
1. We need to add the columns when creating a table 2. onUpgrade method: if (oldVersion < 7) { db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID); db.execSQL(DATABASE_ALTER_LAST_UPLOADED); db.execSQL(DATABASE_ALTER_PAPER_LABEL); }
где:" DATABASE_ALTER_ADD_PAPER_PAID " - это запрос.
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE " + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
После выше двух операций он будет отлично работать для свежего пользователя установки и пользователя обновления приложения
для добавления нового столбца в таблицу необходимо использовать
ALTER
. В Android вы можете добавить новый столбец внутриonUpgrade()
.вы можете удивляться, как
onUpgrade()
добавить новый столбец?при реализации подкласса
SQLiteOpenHelper
, вам нужно вызвать конструктор суперкласса:super(context, DB_NAME, null, 1);
в конструкторе класса. Там я прошел1
для версии.когда я изменил версию
1
выше(2
или больше),onUpgrade()
будет вызван. И выполните изменения SQL, которые я намерен сделать. Мой конструктор класса после изменения версии:public DatabaseHelper(Context context) { super(context, DB_NAME, null, 2);//version changed from 1 to 2 }
SQL modifications проверяет, как это, конструктор суперкласса сравнивает версию сохраненного файла базы данных SQLite с версией, которую я передал
super()
. Если эти (предыдущие и теперь) номера версий отличаютсяonUpgrade()
вызывается.код должен выглядеть так:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // add new columns to migrate to version 2 if (oldVersion < 2) { db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)"); } // add new columns to migrate to version 3 if (oldVersion < 3) { db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER"); } }
я наткнулся на ссылку при поиске той же проблемы. В нем объясняется, как использовать обновление. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
это объясняет, почему использовать данный ниже код
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL(DATABASE_ALTER_TEAM_1); } if (oldVersion < 3) { db.execSQL(DATABASE_ALTER_TEAM_2); } }
самый простой способ создать новый столбец в таблице-это добавить SQL в метод onUpgrade () в классе SQLiteOpenHelper. Например:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(SQL_MY_TABLE); case 2: db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT"); } }