Как добавить новую колонку в базу данных Android SQLite? - PullRequest
75 голосов
/ 28 ноября 2011

У меня одна проблема с базой данных Android SQLite.

У меня есть одна таблица, которая содержит одно поле.StudentFname и это приложение работает нормально с Android 2.3.1, и теперь, если я добавляю другое поле, мое приложение не работает должным образом.

Может ли кто-нибудь помочь мне, кто очень хорошо знает базу данных,

Ответы [ 11 ]

176 голосов
/ 28 ноября 2011

Вы можете использовать функцию ALTER TABLE в своем методе onUpgrade(), например:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}

Очевидно, что SQLite будет отличаться в зависимости от определения столбца.

23 голосов
/ 07 мая 2015

Я сталкивался с этой веткой, когда нуждался в помощи в моем собственном приложении, но видел проблемы со многими ответами. Я бы порекомендовал сделать следующее:

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 версии, и чтобы оператор обновления выполнял только одно необходимое обновление. Подробнее об этом читайте в этом блоге .

22 голосов
/ 28 ноября 2011

Самый простой способ сделать это - добавить метод 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");
    }
}
13 голосов
/ 21 февраля 2016

Возможно, немного более элегантный подход с использованием 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

    }

}
3 голосов
/ 19 мая 2016

Я думаю, что мы не должны проверять подобное условие

 if (newVersion > oldVersion) {
 }

, потому что если мы используем это, это означает, что каждый раз, когда мы увеличиваем версию базы данных, вызывается onUpdrade () и условие будет истинным, поэтомумы должны проверить таким образом

if(oldVersion==1) 
{

}

, поэтому в этом случае, если старая версия равна 2, условие будет ложным, и пользователь со старой версией 2 не будет обновлять базу данных (которую пользователь хочет только для версии 1), потому чтодля этих пользователей база данных уже обновлена.

3 голосов
/ 09 октября 2013

@Aamirkhan.i я думаю, что вы бы решили проблему, которую вы упомянули в комментариях давным-давно. Я думаю, вы не увеличили версию базы данных.или же ответы здесь просты. Я пишу это, потому что это может помочь любому, кто не увеличил или не изменил свой номер версии базы данных, когда они изменяют таблицу.

2 голосов
/ 26 сентября 2017

Я сделал следующий подход, он для меня восстановлен

если версия БД: 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;";

После двух вышеуказанных операций он будет работать нормально для нового пользователя установки и пользователя обновления приложения

1 голос
/ 29 мая 2018

Просто измените свой код

private final int DATABASE_VERSION = 1;

до

private static final int DATABASE_VERSION = 2;

1 голос
/ 19 июля 2017

Для добавления нового столбца в таблицу необходимо использовать 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 выполняется следующим образом: конструктор суперкласса сравнивает версию сохраненного файла базы данных 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");
    }
}
0 голосов
/ 29 июня 2017

Самый простой способ создать новый столбец в таблице - добавить 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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...