Как добавить новый столбец в базу данных Android SQLite?

54

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

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

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

Теги:
database

10 ответов

141
Лучший ответ

вы можете использовать функцию 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 будет отличаться в зависимости от определения столбца.

  • 1
    Привет! Я попробовал это, я использовал при обновлении метода и внутри, что я поставил также изменить таблицу запроса. Но я по-прежнему не могу добавить новый столбец в базу данных ... но когда я пишу запрос, чтобы добавить новый столбец и переименован база данных и имя таблицы, чем я могу добавить новый столбец .. но с помощью метода изменения таблицы я не могу сделать это .. переименование базы данных и таблицы не является желаемой задачей .. она должна работать с изменением таблица .. пока я не могу сделать это с помощью метода изменения таблицы ..
  • 0
    как увеличить значение как 0,1,2,3, ..........
Показать ещё 3 комментария
18

Самый простой способ сделать это - добавить метод 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");
    }
}
  • 0
    Я пробовал это, но все же я не могу добавить новый столбец с помощью метода изменения таблицы в методе обновления.
  • 0
    Привет! Я попробовал это, я использовал при обновлении метода и внутри, что я поставил также изменить таблицу запроса. Но я по-прежнему не могу добавить новый столбец в базу данных ... но когда я пишу запрос, чтобы добавить новый столбец и переименован база данных и имя таблицы, чем я могу добавить новый столбец .. но с помощью метода изменения таблицы я не могу сделать это .. переименование базы данных и таблицы не является желаемой задачей .. она должна работать с изменением таблица .. пока я не могу сделать это с помощью метода изменения таблицы
Показать ещё 2 комментария
16

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

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

Вы хотите убедиться, что код будет работать, когда пользователи будут обновлять более одной версии и что в инструкции обновления выполняется только одно обновление. Чтобы немного узнать об этом, ознакомьтесь с этим blog.

  • 0
    что делать, если мы хотим создать измененный столбец со значением String по умолчанию ??
  • 3
    Лучшее решение, которое я прочитал, и хороший блог, кстати!
13

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

Здесь также приличная страница в синтаксисе для изменения таблицы: 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

    }

}
  • 0
    Это способ обработки нескольких обновлений. Проверка, какая версия приходит!
  • 0
    Если вы переходите с версии 1 на 3 напрямую (если кто-то не обновляет приложение автоматически), вы не достигнете варианта 2.
Показать ещё 1 комментарий
3

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

  • 0
    да, изменение имени базы данных и удаление приложения и его повторная установка решит проблему
  • 0
    @Aamirkhan, пожалуйста, переместите чек к следующему ответу, чтобы более понятное решение было доступно общественности.
2

Я сделал следующий подход, он был заменен для меня

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

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

2

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

 if (newVersion > oldVersion) {
 }

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

if(oldVersion==1) 
{

}

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

0

Чтобы добавить новый столбец в таблицу, вам нужно использовать 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 db с версией, которую я передал 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

Самый простой способ создать новый столбец в таблице - добавить 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");
    }
}
0

Я нашел ссылку во время поиска той же проблемы. В нем объясняется, как использовать обновление. 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);
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню