У меня одна проблема с SQLite
базой данных Android .
У меня есть одна таблица, содержащая одно поле .StudentFname, и это приложение отлично работает с Android 2.3.1, и теперь, если я добавлю еще одно поле, мое приложение не работает должным образом.
Может ли кто-нибудь помочь мне, кто очень хорошо знает базу данных,
if (newVersion > oldVersion)
условие здесь не нужно, потому что оно вызываетсяonUpgrade
только при выполнении этого условия, т. е. новая версия больше, чем старая версияЯ наткнулся на эту ветку, когда нуждался в помощи в моем собственном приложении, но обнаружил проблемы со многими ответами. Я бы порекомендовал сделать следующее:
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); } }
Вы хотите убедиться, что код будет работать, когда пользователи обновят более одной версии, и что оператор обновления запускает только одно необходимое обновление. Чтобы узнать больше об этом, посетите этот блог .
источник
Самый простой способ сделать это - добавить какой-нибудь
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"); } }
источник
Возможно, немного более элегантный подход с использованием 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 } }
источник
Я проделал следующий подход, он восстановлен для меня
если версия БД: 6
Ex : There is a table with 5 columns
При обновлении до: 7 (я добавляю 1 новый столбец в 3 таблицы)
Где: "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;";
После двух вышеуказанных операций он будет отлично работать для нового пользователя установки и пользователя обновления приложения.
источник
@ Aamirkhan.i думаю, что вы бы уже давно решили проблему, о которой упоминали в комментариях. Думаю, вы не увеличивали версию базы данных. в противном случае ответы здесь прямые. Я пишу это, потому что это может помочь любому, кто не увеличивал или не менял номер версии своей базы данных, когда они изменяют таблицу.
источник
Я думаю, что мы не должны проверять такое условие
потому что, если мы используем это, это означает, что каждый раз, когда мы увеличиваем версию базы данных, будет вызываться onUpdrade (), и условие будет истинным, поэтому мы должны проверить это
поэтому в этом случае, если старая версия равна 2, тогда условие будет ложным, и пользователь со старой версией 2 не будет обновлять базу данных (который пользователь хочет только для версии 1), потому что для этих пользователей база данных уже обновлена.
источник
Чтобы добавить новый столбец в таблицу, вам нужно использовать
ALTER
. В android вы можете добавить новый столбец внутри файлаonUpgrade()
.Вы можете спросить, а как
onUpgrade()
добавить новый столбец?При реализации подкласса
SQLiteOpenHelper
необходимо вызвать конструктор суперкласса:super(context, DB_NAME, null, 1);
в конструкторе класса. Там я перешел1
за версию.Когда я изменил версию
1
на выше (2
или выше),onUpgrade()
будет вызываться. И выполните изменения SQL, которые я собираюсь сделать. Мой конструктор класса после изменения версии:Изменения SQL проверяются таким образом, конструктор суперкласса сравнивает версию сохраненного файла базы данных 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
это объясняет, почему использовать этот код ниже
источник
Самый простой способ создать новый столбец в таблице - это добавить некоторый 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"); } }
источник
сначала увеличьте номер версии базы данных. а затем в
onUpgrade
методе вы можете проверить, существует ли уже столбец, если не то только добавить столбец@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(!existsColumnInTable(db, TABLE_NAME, COLUMN_NAME)){ db.execSQL("ALTER TABLE foo ADD COLUMN COLUMN_NAME INTEGER DEFAULT 0"); } } private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) { Cursor cursor = null; try { // Query 1 row cursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null); // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1 if (cursor.getColumnIndex(columnToCheck) != -1) return true; else return false; } catch (Exception Exp) { return false; } finally { if (cursor != null) cursor.close(); } }
этот метод извлекается из этой ссылки Проверка наличия столбца в базе данных приложения в Android
источник