2013-01-22 10 views
6

Wie kann ich eine Tabelle mit aktualisierten Informationen löschen und neu erstellen?SQLite-Tabelle löschen und neu erstellen

Zum Beispiel; Ich habe eine Tabelle in meiner Anwendung mit 5 Datensätzen.

ID  Entry 
1  a 
2  b 
3  c 
4  d 
5  e 

Wenn ich jetzt ein Datensatz löschen kann sagen, ID 3 die Tabelle wird

ID  Entry 
1  a 
2  b 
4  d 
5  e 

Wie kann ich es löschen und neu erstellen, dies zu werden:

ID  Entry 
1  a 
2  b 
3  d 
4  e 

Tatsächlich ist die Das Löschen wird vom Benutzer gesteuert, sodass jeder Datensatz jederzeit gelöscht werden kann.

+0

Warum Sie dies erreichen wollen? Sie müssten die Datenbank jedes Mal neu erstellen, wenn ein Benutzer etwas darin ändert. – Leandros

+1

warum brauchst du das? anstatt eine umständliche Art der Beantwortung Ihrer Frage zu finden, würde ich lieber einen Weg finden, es nicht zu brauchen. – njzk2

+0

nein. Ich möchte die Tabelle nicht die Datenbank neu erstellen.Es gibt ein paar Gründe warum; Beispiel: Wenn ein Datensatz gelöscht wird, wird der Löschvorgang von der aktuell ausgewählten Zeile ausgeführt, da ich nur bis Zeile 4 auswählen kann, ID 5 kann nie gelöscht werden. – Pztar

Antwort

13

könnten Sie Folgendes tun: Löschen Sie die Zeile, die Sie löschen möchten:

 public boolean deleteRow(int id) 
     { 
     return db.delete(YOUR_TABLE, ROW_ID + "=" + _id, null) > 0; 
     } 

lesen restlichen Einträge (nur Einträge, nicht die id) in einer Arraylist, lassen Sie Ihren Tisch:

 db.execSQL("DROP TABLE IF EXISTS " + YOUR_TABLE); 

und erstellen Sie Ihre Tabelle neu. Dann sind die ID-Nummern wieder von 1 bis XX in Reihenfolge

+1

das ist ziemlich viel was ich habe. Wenn ich jedoch die Tabelle ablege und dann gehe, um sie neu zu erstellen, kommt sie als NullPointer zurück. Ich weiß nicht, ich denke, ich werde noch etwas damit herumspielen müssen. – Pztar

+0

Könnten Sie bitte den Code zeigen, wo Sie dies getan haben? Zum Beispiel, wenn Sie es in einer falschen Reihenfolge getan haben, ist es möglich, dass Sie Ihre Tabelle vor dem Speichern in der ArrayList löschen. Das könnte der Grund sein, warum Du einen Nullpointer bekommst. In Deutschland sagen wir, manchmal konnte man den Wald wegen so vieler Bäume nicht sehen :) – Opiatefuchs

+0

Muss nach EXISTS ein Leerzeichen hinzugefügt werden – Matthew

1

Ich weiß, dass dies ein alter Beitrag ist, aber ich dachte, ich würde Dinge für andere klären, die das gleiche tun können wie Sie basierend auf Ihrem Kommentar:

Wenn ein Datensatz den Löschvorgang gelöscht wird durch die aktuell ausgewählte Zeile getan wird, da ich nur 4 rudern können, wählen Sie bis, ID 5 kann nie werden gelöscht.

Sie sollten Ihre IDs nicht wirklich neu erstellen. Es vermasselt Dinge, wenn sie als Schlüssel in einer anderen Tabelle verwendet werden, und wenn Sie eine große Datenbank haben, kann das erneute Erstellen von Daten nur Zeit verschwenden, wenn es wirklich nicht nötig ist.

Was Sie tun sollten, ist ein Array der IDs zusammen mit einem Array der Einträge zu speichern, so dass Sie wissen, welche ID zu löschen, basierend auf welcher Zeile sie ausgewählt haben (oder eine andere Art der Verknüpfung der IDs und Werte, so dass Sie greifen können sie später).

Im obigen Beispiel, nachdem jemand die Zeile mit der ID löscht 3, Ihre Arrays würde wie folgt aussehen:

entries = { "a","b","d","e" } 
ids = { 1,2,4,5 } 

wenn jemand wählt „e“, das das vierte Element ist, können Sie einfach aus dem löschen Tabelle, bei der die ID dem vierten Wert im Array ids entspricht, in diesem Fall 5.

Auf diese Weise kann Ihre Datenbank mit den IDs 2, 34, 56 und 435 enden, wenn Elemente ständig hinzugefügt und entfernt werden. Das ist egal, weil Ihr Code verfolgt und weiß, welche ID gelöscht werden soll.

0

Ein anderer Ansatz

public boolean deleteTable(int id) { 
    SQLiteDatabase database = dbHelper.getReadableDatabase(); 
    final String whereClause = DBHelper.COLUMN_ID + "=?"; 
    final String whereArgs[] = {String.valueOf(id)}; 
    int affectedRows = database.delete(DBHelper.TABLE_NAME_OGR, whereClause, whereArgs); 
    return affectedRows > 0; 
} 
Verwandte Themen