Ich habe ein Problem mit der Android- SQLite
Datenbank.
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,
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 .
quelle
Der einfachste Weg, dies zu tun, besteht darin, eine
SQL to the onUpgrade()
Methode in Ihre hinzuzufügenSQLiteOpenHelper 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"); } }
quelle
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 } }
quelle
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)
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
quelle
@ 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.
quelle
Ich denke, wir sollten den Zustand nicht so überprüfen
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
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.
quelle
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ügenonUpgrade()
.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 ich1
für die Version bestanden.Wenn ich die Version
1
auf oben (2
oder 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: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"); } }
quelle
Ändern Sie einfach Ihren Code
zu
quelle
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
quelle
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"); } }
quelle