2016-03-23 3 views
0

Ich habe fünf Tabellen in meinem SQL-Db, die fünf Tabellen werden in oncreate-Methode erstellt, wenn ich Änderungen an einer Tabelle im Upgrade vornehmen Methode basierend auf der vorherigen db-Version, als ich die App gestartet habe, die Änderungen vorgenommen werden, kann ich durch meine Logcat sehen, aber es ruft Oncreate-Methode und sagen, dass die 4 Tabellen bereits vorhanden sind. Wie kann ich mit diesem Fehler umgehen?Wie man Änderungen an einer Tabelle in onupgrade-Methode der Datenbank von fünf Tabellen ohne den Rest in oncreate Methode

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { 

    if (version_old < 3) { 
     database.execSQL(queryFive); 
    } 

on onCreate Ich habe Anweisungen, die Tabelle zunächst erzeugt, die dann wieder nach ONUPGRADE aufgerufen wird und die Auslösung der Fehler sie bereits vorhanden sind. Wie kann ich damit umgehen? Vielen Dank.

+0

Was leiten Sie in 'queryFive' ​​weiter? –

Antwort

0
  1. Wenn Sie Änderungen in einer Tabelle machen, sollten Sie die DATABASE_VERSION = 1,2,3 erhöhen und so weiter.

  2. Wenn Änderungen in der Datenbank vorgenommen werden, sollten Sie zuerst alle Tabellen löschen (löschen) und sie erneut erstellen.

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); // drop table(s),if you have five tables , drop all five 
        onCreate(db); // this will create all tables again 
    } 
    

Update: bei nicht alten Daten von anderen Tabellen

Sie verlieren brauchen eine abstrakte Klasse, die den Upgrade-Prozess hier beschrieben implementiert. Dann erweitern Sie diese abstrakte Klasse für jede Ihrer Tabellen. In Ihrer abstrakten Klasse müssen Sie Ihre Tabellen auf eine Weise speichern (Liste, fest codiert), so dass Sie bei der Ausführung von onUpgrade über die Tabellenelemente iterieren und für jedes Tabellenelement die beschriebenen Schritte ausführen. Sie werden selbst aktualisiert und behalten alle ihre vorhandenen Details bei. Beachten Sie, dass das Ereignis onUpgrade nur einmal pro Datenbank ausgelöst wird. Aus diesem Grund müssen Sie alle Ihre Tabellen durchlaufen, um alle zu aktualisieren. Sie behalten nur 1 Versionsnummer über die gesamte Datenbank.

  • begintransaction
  • Lauf eine Tabellenerstellung mit if not exists (wir ein Upgrade durchführen, so dass die Tabelle möglicherweise noch nicht vorhanden ist, wird es nicht ändern und Drop)
  • put in einer Liste die vorhandenen Spalten List<String> columns = DBUtils.GetColumns(db, TableName);
  • Backup-Tabelle (ALTER table " + TableName + " RENAME TO 'temp_" + TableName)
  • neue Tabelle erstellen (das neueste Tabellenerstellung Schema)
  • die Kreuzung mit den neuen Spalten bekommen, diesmal Spalten nehmen n aus der aktualisierten Tabelle (columns.retainAll(DBUtils.GetColumns(db, TableName));)
  • Daten wiederherstellen (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • entfernen Backup-Tabelle (DROP table 'temp_" + TableName)
  • setTransactionSuccessful

anders als das, es ist nicht so, wie Sie dies erreichen können. es sei denn, Sie können separate DB-Datei für jede Tabelle erstellen.

+0

Ich möchte nicht die Daten in den anderen Tabellen verlieren, Sie dnt scheint meinen Punkt auf onupgrade zu bekommen, ich möchte noch intakte Daten in den Tabellen haben erstellt –

+0

Sie können alternative versuchen, die ich hinzugefügt habe. –

+0

Danke für die Antwort, aber das sieht sehr kompliziert aus gibt es ein Beispiel, das ich online finden kann.Ich habe versucht, die oncreate-Methode in d db zu kommentieren, aber neue Benutzer haben diese anfängliche Tabelle nicht –

Verwandte Themen