Android SQLite Tabelle neue Spalten hinzufügen

bruce85

Bekanntes Mitglied
Hallo,
ich habe folgendes Problem und zwar, möchte ich neue Spalten hinzufügen, bei einer bestehende SQLite Tabelle.
Leider wird die Tabelle komplett gelöscht und neu erstellt, wenn das hier ausgeführt wird:
Code:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.d(TAG, String.format("SQLiteDatabase.onUpgrade(%d -> %d)", oldVersion, newVersion));

    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST1+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST2+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST3+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST4+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST5+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST6+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST7+" INTEGER DEFAULT 0");
    }
    db.execSQL("DROP TABLE IF EXISTS " + TestMemo1.TABLE);
    db.execSQL("DROP TABLE IF EXISTS " + TestMemo2.TABLE);
    db.execSQL("DROP TABLE IF EXISTS " + TestMemo3.TABLE);

    onCreate(db);
}

Wie könnte ich jetzt neue Spalten hinzufügen, ohne das etwas verloren geht?

Danke schon mal für die Hilfe.

Gruss
 

bruce85

Bekanntes Mitglied
Danke für die schnelle antwort.
Wenn ich die 3 DROP Table raus nehme, dann erhalte ich folgende fehlermeldung:
Code:
Caused By : SQL(query) error or missing database.
(table test_table already exists (code 1): , while compiling: CREATE TABLE test_table(id INTEGER PRIMARY KEY AUTOINCREMENT,...........

Hier ist mal die DBHelper Class:
Code:
public class DBHelper  extends SQLiteOpenHelper {
    //version number to upgrade database version
    //each time if you Add, Edit table, you need to change the
    //version number.
    private static final int DATABASE_VERSION =9;
    // Database Name
    private static final String DATABASE_NAME = "data.db";
    private static final String TAG = DBHelper.class.getSimpleName().toString();

    public DBHelper() {
        super(App.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //All necessary tables you like to create will create here
        db.execSQL(TestMemo1.createTable());
        db.execSQL(TestMemo2.createTable());
        db.execSQL(TestMemo3.createTable());
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, String.format("SQLiteDatabase.onUpgrade(%d -> %d)", oldVersion, newVersion));

        if (newVersion > oldVersion) {
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST1+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST2+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST3+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST4+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST5+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST6+" INTEGER DEFAULT 0");
            db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST7+" INTEGER DEFAULT 0");
        }
        onCreate(db);
    }
}

Wie könnte man das Problem denn lösen?

Gruss
 

Joose

Top Contributor
Indem du "CREATE TABLE IF NOT EXISTS" verwendest um Tabellen nur zu erstellen wenn sie noch nicht vorhanden sind.
Andere Lösung -> warum rufst du aus "onUpgrade" die "onCreate" Methdoe auf? Welchen Sinn soll das haben?
 

bruce85

Bekanntes Mitglied
Ups, das weiß ich selbst nicht, wieso ich dort die Tabellen neu erstelle.
Ich hab damals ein Tutorial durchgelesen und irgendwie onCreate(db) mit da rein geschrieben.

Edit: Ich hab das noch so abgeändert:
Java:
switch (oldVersion) {
    case 8:
        //upgrade from version 8 to 9
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST1+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST2+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST3+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST4+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST5+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST6+" INTEGER DEFAULT 0");
        db.execSQL("ALTER TABLE "+TestMemo1.TABLE+" ADD COLUMN "+TestMemo1.COLUMN_TEST7+" INTEGER DEFAULT 0");
        break;
    case 2:
        //upgrade from version 9 to 10................
}

Jetzt funktioniert es super, vielen Dank für die schnelle Hilfe.
Gruss
 
Zuletzt bearbeitet:

Tobse

Top Contributor
@bruce85

Dieses Switch-Statement kann nicht funktionieren. Was machst du denn, wenn einer von 8 auf 10 upgraded (also das 9er update nicht installiert)? Benutze ein Tool wie Liquibase oder Flyway, damit ists einfacher.
 

mrBrown

Super-Moderator
Mitarbeiter
Dieses Switch-Statement kann nicht funktionieren. Was machst du denn, wenn einer von 8 auf 10 upgraded (also das 9er update nicht installiert)? Benutze ein Tool wie Liquibase oder Flyway, damit ists einfacher.
Naja, wenn man das sinnvoll strukturiert und durchrutschen lässt, werden dann nacheinander 9 und 10 ausgeführt.
Was geeignetes ist natürlich deutlich sinnvoller, läuft Liquibase unter Android?
 

bruce85

Bekanntes Mitglied
Danke.
Ich habe mich in Google Informiert und das sollte eigentlich so funktionieren, nur der break; befehl sollte weg gelassen werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
C SQLite Datenbank in Kotlin - App stürtzt immer ab Android & Cross-Platform Mobile Apps 0
L Android SQLite Datenbank auf SDCard speichern Android & Cross-Platform Mobile Apps 5
J SQLite Datenbank sichern/in ein anderes Verzeichnis kopieren Android & Cross-Platform Mobile Apps 2
B Android SQLite Datenbank 2 Einträge vertauschen? Android & Cross-Platform Mobile Apps 14
B Android SQLite Datenbankdatei von SD-Karte zu DatabasePath kopieren Android & Cross-Platform Mobile Apps 5
L Android SQLite mit HSQLDB über Android synchronisieren Android & Cross-Platform Mobile Apps 13
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
T Android SQLite getColumnIndex Android & Cross-Platform Mobile Apps 6
U SQLite-Datenbank Probleme Android & Cross-Platform Mobile Apps 8
L Android Wie erstelle ich eine dynamische Tabelle (TableLayout)? Android & Cross-Platform Mobile Apps 2
S Combobox mit 2 Spalten aus MySql Tabelle Android & Cross-Platform Mobile Apps 1
K Löschen einer Tabelle bei PlayStore update Android & Cross-Platform Mobile Apps 2
B TableLayout verhält sich nicht wie eine Tabelle Android & Cross-Platform Mobile Apps 3
B Android Tabelle dynamisch sortieren / filtern möglich Android & Cross-Platform Mobile Apps 2
G Android Tabelle dynamisch erzeugen Android & Cross-Platform Mobile Apps 7
G Java ME Tabelle in J2ME Android & Cross-Platform Mobile Apps 4
E Neue app erstellen Android & Cross-Platform Mobile Apps 3
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
J Android App stürzt ab wenn neue activity gestartet Android & Cross-Platform Mobile Apps 6
S Android neue Version des Programms wird nicht in Emulator geladen Android & Cross-Platform Mobile Apps 1
S Neue Activity lässt sich nicht starten Android & Cross-Platform Mobile Apps 28
J Android neue View mit OnTouchListener Android & Cross-Platform Mobile Apps 0
D Android Neue Activity im TabWidget laden Android & Cross-Platform Mobile Apps 8

Ähnliche Java Themen

Neue Themen


Oben