Как добавить новый столбец в базу данных 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 для меня

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

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


чтобы добавить новый столбец в таблицу, что вам нужно использовать 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;