Jak dodać nową kolumnę do bazy danych Android SQLite?

Mam jeden problem z bazą danych Androida SQLite.

Mam jedną tabelę, która zawiera jedno pole.StudentFname a ta aplikacja działa dobrze z Androidem 2.3.1 i teraz, jeśli dodam kolejne pole, to moja aplikacja nie działa poprawnie.

Czy ktoś może mi pomóc, kto zna bazę danych bardzo dobrze,

Author: Nilesh Rathod, 2011-11-28

11 answers

Możesz użyć funkcji ALTER TABLE na swojej metodzie onUpgrade(), tak:

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

Oczywiście, SQLite będzie się różnić w zależności od definicji kolumny.

 166
Author: DevYudh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 11:20:26

Najprostszym sposobem na to jest dodanie metody SQL to the onUpgrade() do twojego SQLiteOpenHelper class. Coś w stylu:

@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");
    }
}
 20
Author: user370305,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-28 05:07:26

Natknąłem się na ten wątek, gdy potrzebowałem pomocy w mojej własnej aplikacji, ale widziałem problemy z wieloma odpowiedziami. Polecam wykonanie:

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

Chcesz się upewnić, że kod będzie działał, gdy użytkownicy uaktualnią więcej niż 1 wersję i że instrukcja update uruchamia tylko jedną wymaganą aktualizację. Aby dowiedzieć się więcej na ten temat, zajrzyj na ten blog.

 20
Author: PFranchise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 22:04:49

Być może nieco bardziej eleganckie podejście przy użyciu przełącznika zamiast if / then, które spowoduje uaktualnienie z dowolnego schematu do najnowszego schematu...

Tutaj jest też porządna strona na temat składni do zmiany tabeli: 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

    }

}
 13
Author: Edward Bagby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-20 22:22:39

@Aamirkhan.myślę, że rozwiązałbyś problem, o którym wspomniałeś w komentarzach dawno temu.myślę, że nie zwiększyłeś wersji bazy danych. albo odpowiedzi tutaj są proste.piszę to, ponieważ może to pomóc każdemu, kto nie zwiększył lub nie zmienił numeru wersji bazy danych podczas zmiany tabeli.

 3
Author: dora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 14:28:22

Myślę, że nie powinniśmy sprawdzać takiego stanu

 if (newVersion > oldVersion) {
 }

Ponieważ jeśli użyjemy tego, oznacza to, że za każdym razem, gdy zwiększymy wersję bazy danych , to onupdrade () wywoła i warunek będzie true, więc powinniśmy sprawdzić w ten sposób

if(oldVersion==1) 
{

}

Więc w tym przypadku jeśli stara wersja jest 2 to warunek będzie false i użytkownik ze starą wersją 2 nie zaktualizuje bazy danych (której użytkownik chce tylko dla wersji 1), ponieważ dla tych użytkowników baza danych była już zaktualizowana .

 2
Author: Himanshu arora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 10:47:43

Zrobiłem następujące podejście, to jest resoved dla mnie

If DB version : 6

Ex : There is a table with 5 columns

Po uaktualnieniu do : 7 (dodaję 1 nową kolumnę w 3 tabelach)

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

Gdzie:" DATABASE_ALTER_ADD_PAPER_PAID " jest zapytaniem.

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

Po powyższych dwóch operacjach będzie działać dobrze dla użytkownika fresh install I użytkownika upgrade aplikacji

 2
Author: sssvrock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 10:06:48

Aby dodać nową kolumnę do tabeli należy użyć ALTER. W Androidzie możesz dodać nową kolumnę wewnątrz onUpgrade().

Możesz się zastanawiać, jak onUpgrade() doda nową kolumnę?

Kiedy implementujesz podklasę SQLiteOpenHelper, musisz wywołać konstruktor klasy superclass: super(context, DB_NAME, null, 1); w konstruktorze klasy. Tam przeszedłem 1 dla wersji.

Kiedy zmieniłem wersję 1 na powyższą(2 lub większą), onUpgrade() będzie wywoływana. I wykonać modyfikacje SQL, które zamierzam do zrobienia. Konstruktor mojej klasy po zmianie wersji:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

SQL modifications sprawdza tak, superclass constructor porównuje wersję przechowywanego pliku SQLite db z wersją, którą przekazałem do super(). Jeśli te (poprzednie i obecne) numery wersji są inne, zostanie wywołane onUpgrade().

Kod powinien wyglądać tak:

@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");
    }
}
 1
Author: Blasanka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 13:36:14

Natknąłem się na link szukając tego samego problemu. Wyjaśnia, jak korzystać z aktualizacji. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

Wyjaśnia dlaczego używać poniższego kodu

 @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);
        }
    }
 0
Author: Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 07:16:23

Najprostszym sposobem na utworzenie nowej kolumny w tabeli jest dodanie SQL do metody onUpgrade() w klasie sqliteopenhelper. Like:

@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
Author: Digvij Borda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 11:14:52

Po prostu zmień swój kod

Private final INT DATABASE_VERSION = 1;

Do

Private static final INT DATABASE_VERSION =2;

 0
Author: Shahzad Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 07:23:40