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


У меня есть одна проблема с Android

11 69

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

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

private final int DATABASE_VERSION = 1;

до

private static final int DATABASE_VERSION =2;