Wie füge ich eine neue Spalte zur Android SQLite-Datenbank hinzu?

82

Ich habe ein Problem mit der Android- SQLiteDatenbank.

Ich habe eine Tabelle, die ein Feld enthält. StudentFname und diese Anwendung funktioniert einwandfrei mit Android 2.3.1. Wenn ich jetzt ein weiteres Feld hinzufüge, funktioniert meine Anwendung nicht richtig.

Kann mir jemand helfen, der die Datenbank sehr gut kennt,

Aamir Khan
quelle

Antworten:

188

Sie können die ALTER TABLEFunktion für Ihre onUpgrade()Methode folgendermaßen verwenden:

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

Offensichtlich unterscheidet sich die SQLite abhängig von der Spaltendefinition.

DevYudh
quelle
1
Hallo! Ich habe dies versucht, ich habe auf upgrate Methode verwendet und darin habe ich auch alter table query gesetzt. Aber immer noch kann ich keine neue Spalte zur Datenbank hinzufügen. Aber ya, wenn ich eine Abfrage schreibe, um neue Spalte hinzuzufügen und umzubenennen Die Datenbank und der Tabellenname sind beide, als ich in der Lage bin, eine neue Spalte hinzuzufügen. Aber mit Hilfe der Methode alter table kann ich dies nicht tun. Das Umbenennen von Datenbank und Tabelle ist nicht die gewünschte Aufgabe. Es sollte mit alter arbeiten table..still ich bin nicht in der Lage, es mit alter table Methode zu tun ..
Aamirkhan
@ NagarjunaReddy Entschuldigung für die späte Antwort. Sie können diese Methode verwenden db.execSQL ("UPDATE-Tabelle SET key = key + 1 WHERE name =?", neuer String [] {name});
DevYudh
3
Vergessen Sie nicht, die Datenbankversion zu erhöhen, da sonst onUpgrade () nicht aufgerufen wird. Erhöhen Sie die Versionsnummer im folgenden Code, der im Konstruktor der Klasse vorhanden ist, die die SQLiteOpenHelper-Klasse erweitert. super (Kontextkontext, Stringname, CursorFactory-Factory, int newVersion)
Appdroid
App friert ein und ich habe viele Meldungen wie diese auf log cat: Der Verbindungspool für die Datenbank '+ data + user + 0 + com ..._ db' konnte keine Verbindung zu Thread 1 (main) mit den Flags 0x5 für gewähren. Warum ist das passiert?
Mahdi
29

Ich bin auf diesen Thread gestoßen, als ich Hilfe in meiner eigenen App benötigte, habe aber Probleme mit vielen Antworten gesehen. Ich würde Folgendes empfehlen:

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

Sie möchten sicherstellen, dass der Code funktioniert, wenn Benutzer mehr als eine Version aktualisieren, und dass die Update-Anweisung nur das Upgrade ausführt, das sie benötigt. Weitere Informationen hierzu finden Sie in diesem Blog .

PFranchise
quelle
Was tun, wenn wir eine geänderte Spalte mit dem Standard-String-Wert erstellen möchten?
Shridutt Kothari
22

Der einfachste Weg, dies zu tun, besteht darin, eine SQL to the onUpgrade()Methode in Ihre hinzuzufügen SQLiteOpenHelper class. Etwas wie:

@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");
    }
}
user370305
quelle
Ich habe dies versucht, aber ich bin immer noch nicht in der Lage, eine neue Spalte hinzuzufügen, indem ich die alter table-Methode in der upgrate-Methode verwende.
Aamirkhan
Hallo! Ich habe dies versucht, ich habe auf upgrate Methode verwendet und darin habe ich auch alter table query gesetzt. Aber immer noch kann ich keine neue Spalte zur Datenbank hinzufügen. Aber ya, wenn ich eine Abfrage schreibe, um neue Spalte hinzuzufügen und umzubenennen Die Datenbank und der Tabellenname sind beide, als ich in der Lage bin, eine neue Spalte hinzuzufügen. Aber mit Hilfe der Methode alter table kann ich dies nicht tun. Das Umbenennen von Datenbank und Tabelle ist nicht die gewünschte Aufgabe. Es sollte mit alter arbeiten table..still ich bin nicht in der Lage, es mit alter table Methode zu tun
Aamirkhan
@ user370305 Sollte ich eine neue Spalte in der Tablle-Erstellungsanweisung für neue Benutzer hinzufügen müssen, die die App zum ersten Mal installieren?
Ahesanali Suthar
15

Vielleicht ein etwas eleganterer Ansatz mit switch anstelle von if / then, der von einem beliebigen Schema auf das neueste Schema aktualisiert wird ...

Hier ist auch eine anständige Seite über die Syntax zum Ändern einer Tabelle: 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

    }

}
Edward Bagby
quelle
Auf diese Weise können mehrere Upgrades durchgeführt werden. Überprüfen, von welcher Version kommt!
Ricardo
Wenn Sie direkt von Version 1 auf Version 3
wechseln
@ TyMarc-- Ja, es wird auf Version 2 und dann auf 3. aktualisiert. Der Switch verwendet die alte Version. In Ihrem Beispiel ist die alte Version also 1. Der Code führt dann Fall 1 aus, der von Version 1 auf 2 aktualisiert wird, und führt dann Fall 2 aus (da es keine Unterbrechung gibt;), der von 2 auf 3 aktualisiert wird. Es ist alles in Ordnung in der Beschreibung.
Edward Bagby
4

Ich habe den folgenden Ansatz gemacht, er ist für mich neu entwickelt

wenn DB-Version: 6

Ex : There is a table with 5 columns

Wenn Sie auf Folgendes aktualisieren: 7 (Ich füge 1 neue Spalte in die 3 Tabellen ein)

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

Wobei: "DATABASE_ALTER_ADD_PAPER_PAID" eine Abfrage ist.

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

Nach den beiden oben genannten Vorgängen funktioniert dies für den Benutzer der Neuinstallation und den Benutzer des App-Upgrades einwandfrei

sssvrock
quelle
3

@ Aamirkhan.Ich denke, Sie hätten das Problem gelöst, das Sie vor langer Zeit in den Kommentaren erwähnt haben. Ich denke, Sie haben die Datenbankversion nicht erhöht. oder die Antworten hier sind einfach. Ich schreibe dies, weil es jedem helfen kann, der seine Datenbankversionsnummer nicht erhöht oder geändert hat, wenn er eine Tabelle ändert.

Dora
quelle
Ja, das Ändern des Datenbanknamens und das Deinstallieren der Anwendung und das erneute
Installieren
@Aamirkhan, bitte verschieben Sie den Scheck auf die nächste Antwort, damit die Öffentlichkeit die klarere Lösung erhält.
AlleyOOP
3

Ich denke, wir sollten den Zustand nicht so überprüfen

 if (newVersion > oldVersion) {
 }

denn wenn wir dies verwenden, bedeutet dies, dass jedes Mal, wenn wir die Datenbankversion erhöhen, onUpdrade () aufruft und die Bedingung wahr ist, also sollten wir dies überprüfen

if(oldVersion==1) 
{

}

Wenn in diesem Fall die alte Version 2 ist, ist die Bedingung falsch und der Benutzer mit der alten Version 2 aktualisiert die Datenbank nicht (was der Benutzer nur für Version 1 wünscht), da für diese Benutzer die Datenbank bereits aktualisiert wurde.

Himanshu Arora
quelle
1

Um der Tabelle eine neue Spalte hinzuzufügen, müssen Sie sie verwenden ALTER. In Android können Sie die neue Spalte innerhalb der hinzufügen onUpgrade().

Sie fragen sich vielleicht, wie onUpgrade()die neue Spalte hinzugefügt wird.

Wenn Sie eine Unterklasse von implementieren SQLiteOpenHelper, müssen Sie den Konstruktor der Oberklasse aufrufen: super(context, DB_NAME, null, 1);in Ihrem Klassenkonstruktor. Dort habe ich 1für die Version bestanden.

Wenn ich die Version 1auf oben ( 2oder höher) geändert habe , onUpgrade()wird aufgerufen. Und führen Sie die SQL-Änderungen durch, die ich beabsichtige. Mein Klassenkonstruktor hat nach dem Ändern der Version:

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

SQL-Änderungsprüfungen wie folgt: Der Superklassenkonstruktor vergleicht die Version der gespeicherten SQLite-Datenbankdatei mit der Version, an die ich übergeben habe super(). Wenn diese (vorherigen und jetzt) ​​Versionsnummern unterschiedlich sind, onUpgrade()wird sie aufgerufen.

Der Code sollte folgendermaßen aussehen:

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

Ändern Sie einfach Ihren Code

private final int DATABASE_VERSION = 1;

zu

private static final int DATABASE_VERSION = 2;

Shahzad Ahmad
quelle
0

Ich bin auf einen Link gestoßen, als ich nach dem gleichen Problem gesucht habe. Es wird erklärt, wie Sie ein Upgrade verwenden. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

Es wird erklärt, warum der folgende Code verwendet wird

 @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);
        }
    }
Anand
quelle
0

Der einfachste Weg, eine neue Spalte in einer Tabelle zu erstellen, besteht darin, der onUpgrade () -Methode in der SQLiteOpenHelper-Klasse etwas SQL hinzuzufügen. Mögen:

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