Android SQLite Datenbank 2 Einträge vertauschen?

bruce85

Bekanntes Mitglied
Hallo,
ich habe in meiner App eine Liste (RecyclerView) und darin kann man bestimmte Einträge miteinander vertauschen mit der Methode Collections.swap und würde diesen Tausch auch in der Datenbank speichern, damit der Tausch beim nächsten App start nicht verloren geht, nur wie mache ich das ambesten?

Ich hab das mal so versucht:
Java:
public void updateSwapTwoItems(int fromPosition, int toPosition) {
    SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();

    ContentValues values = new ContentValues();
    values.put(TestMemo.COLUMN_TEST1, AppConst.ITEMS.get(toPosition).getTest1());
    values.put(TestMemo.COLUMN_TEST2, AppConst.ITEMS.get(toPosition).getTest2());
    values.put(TestMemo.COLUMN_TEST3, AppConst.ITEMS.get(toPosition).getTest3());
    values.put(TestMemo.COLUMN_TEST4, AppConst.ITEMS.get(toPosition).getTest4());
    db.update(TestMemo.TABLE, values, TestMemo.COLUMN_ID+"="+AppConst.ITEMS.get(fromPosition).getId(), null);

    values.clear();
    values.put(TestMemo.COLUMN_TEST1, AppConst.ITEMS.get(fromPosition).getTest1());
    values.put(TestMemo.COLUMN_TEST2, AppConst.ITEMS.get(fromPosition).getTest2());
    values.put(TestMemo.COLUMN_TEST3, AppConst.ITEMS.get(fromPosition).getTest3());
    values.put(TestMemo.COLUMN_TEST4, AppConst.ITEMS.get(fromPosition).getTest4());
    db.update(TestMemo.TABLE, values, TestMemo.COLUMN_ID+"="+AppConst.ITEMS.get(toPosition).getId(), null);

    DatabaseManager.getInstance().closeDatabase();
}

Damit klappt es einfach nicht richtig, es muss ja eine andere bessere Methode geben.
Die id müsste auch vertauscht werden, da ich mehrere Tabellen habe, in denen ich ein Paar abfrage mache anhand der ids von dieser Tabelle, aber die id lässt sich nicht ändern.

Wie könnte man das Problem am besten lösen?

Ich bedanke mich schon mal für die Hilfe.

Gruss
 
Zuletzt bearbeitet:

bruce85

Bekanntes Mitglied
Vielen Dank für die schnelle antwort.
Die idee hatte ich auch gerade und lasse die Einträge dann anhand der sortId Sortieren beim auslesen.
Ich werde es mal testen, vielen Dank.


Gruss
 

Thallius

Top Contributor
Denk dran der Spalte einen Index zu geben (einen primary) damit geht das Sortieren viel schneller und du kannst keine Zahl doppelt vergeben und verhinderst damit Fehler beim umsortieren
 

bruce85

Bekanntes Mitglied
Danke.
Genau da ist mein Problem:
Der Index ist ja nicht veränderbar, wenn ich das Sortieren über den Index mache, dann müsste ich den Index mit Sortieren, da ansonsten meine weiteren Tabellen unbrauchbar sind, da ich ja einige Einträge von einer anderen Tabelle auslese anhand der Index von dieser Tabelle, und wenn die Einträge dann Sortiert sind, stimmen die Einträge nicht mehr, da der Index ja an der gleiche Position ist.

Gruss
 

Thallius

Top Contributor
Also du kannst natürlich nicht einen Index nennen wie den anderen. Aber es sollte doch gehen, dass du den Zielindex erstmal auf -1 setzt und dann den Quellindex änderst auf den Zielindex und dann den Zielindex auf den Quellindex oder?

Gruß

Claus
 

bruce85

Bekanntes Mitglied
Danke für die antwort.
Ich habe z.B. 2 Tabellen:
Tabelle1 mit folgende Spalten:
Java:
id    title    usw.

Tabelle2 mit folgende Spalten:
Java:
id    tabelle1_id    title    usw.

Wenn ich jetzt die Einträge von Tabelle1 bsp. umgekehrt Sortiere mit:
Java:
SELECT * FROM tabelle1 ORDER BY id DESC
und die ausgabe dann in einem Array Speichern, dann stimmen die Einträge nicht mehr mit den ids überein, wenn ich dann eine abfrage von Tabelle2 mache und die dazugehörige Eintrag von Tabelle1 abfrage anhand der tabelle1_id.

Ich hab jetzt einfach eine weitere Spalte namens sort_id hinzugefügt und lasse einfach die gewünschte Reihenfolge dort Updaten und frage die dann später so ab:
Java:
SELECT * FROM tabelle1 ORDER BY sort_id ASC

Oder könnte man das anders lösen?

Gruss
 

mrBrown

Super-Moderator
Mitarbeiter
und die ausgabe dann in einem Array Speichern, dann stimmen die Einträge nicht mehr mit den ids überein, wenn ich dann eine abfrage von Tabelle2 mache und die dazugehörige Eintrag von Tabelle1 abfrage anhand der tabelle1_id.
Wenn ich dich richtig verstehe, nutzt du den Index als ID? Dann solltest du einfach nicht den Index als ID verwenden, dann hast du das Problem nicht. Die ID steht schließlich auch im Result drin, nutz einfach die
 

bruce85

Bekanntes Mitglied
Ja, aber ich brauche die ID und es dürfen auch keine Doppelte IDs in Tabelle1 drin sein, deshalb habe ich diese als Index genommen, die bei jedem neuen Eintrag um 1 erhöht wird.

Ich habe z.B. mehrere Kategorien und anhand der IDs ordne ich die Einträge zu der passende Kategorie.
Die Einträge kann man auch nach seinen wünschen Sortieren und diese Sortierung sollen in der Datenbank dauerhaft gespeichert bleiben und wenn ich die Tabellen über den Index sortiere, dann wäre sozusagen alles durcheinander, da der Index ja immer an der gleiche Position bleibt und nur die Einträge Sortiert sind.
Wenn ich dann von der Tabelle2 eine abfrage mache und die richtige Kategorie raus suche von Tabelle1 anhand der Index, dann wäre da ein andere Eintrag, da ja nur die Einträge Sortiert sind und der Index ja stehen bleibt, deshalb habe ich noch eine Spalte namens sort_id genommen und bei jedem neuen Eintrag, trage ich in der Spalte sort_id immer den höchsten wert (anzahl der datensätze) ein und so klappt es ohne Probleme die Einträge korrekt zu sortieren.

Die Tabelle werden ja ausgelesen und in einem ArrayList gespeichert, diese Array kann man beliebig Sortieren und diese Sortierung soll dann einfach auch in der Datenbank gespeichert sein, beim wieder auslesen.

Sorry, ich hoffe, das ich es einigermaßen verständlich erklärt habe.

Gruss
 

mrBrown

Super-Moderator
Mitarbeiter
Ich denke ich verstehe was du meinst...

Wenn ich das richtig verstehe, benutzt du die ID, die ein Datensatz in der Datenbank hat, als Index für die Listen, die dein Programm benutzt, und genau das solltest du nicht tun. Die ID aus der Datenbank sollte im Objekt in der Liste stehen, und nicht als Index dafür missbraucht werden, spätestens beim löschen einzelner Einträge gibt es sonst wieder Fehler.

Eine zusätzliche Spalte, um die Sortierung zu speichern ist sinnvoll, diese solltest du aber weder als ID noch als Index benutzen, sondern nur zum sortieren. Irgendetwas anderes als die ID aus der Datenbank als ID für die Datenbank zu nutzen oder die ID aus der Datenbank für irgendetwas anders zu nutzen führt nur zu Problemen
 

bruce85

Bekanntes Mitglied
Danke.
Aber wozu benötigt man denn sonst einen Index?
Meiner meinung nach ist diese auch dafür da um einen Eintrag zu identifizieren.
Wenn ich bei der Tabelle2 einen Eintrag hinzufüge, dann kann ich ja z.B. bei der Tabelle2 im Spalte cat_id auch die ID von Tabelle1 hinzufügen, um diese Später identifizieren zu können, unter welcher Kategorie dieser Eintrag gehört.
In der Tabelle2 habe ich ja z.B. eine weitere Spalte cat_id, diese jedoch keinen Index ist, sondern nur eine Integer ohne Autoincrement, und dort lasse ich die jeweilige ID von Tabelle1 eintragen, je nach dem in welcher Kategorie man sich gerade befindet.

Gruss
 

mrBrown

Super-Moderator
Mitarbeiter
Aber wozu benötigt man denn sonst einen Index?
Meiner meinung nach ist diese auch dafür da um einen Eintrag zu identifizieren.
Wenn ich bei der Tabelle2 einen Eintrag hinzufüge, dann kann ich ja z.B. bei der Tabelle2 im Spalte cat_id auch die ID von Tabelle1 hinzufügen, um diese Später identifizieren zu können, unter welcher Kategorie dieser Eintrag gehört.
In der Tabelle2 habe ich ja z.B. eine weitere Spalte cat_id, diese jedoch keinen Index ist, sondern nur eine Integer ohne Autoincrement, und dort lasse ich die jeweilige ID von Tabelle1 eintragen, je nach dem in welcher Kategorie man sich gerade befindet.

Redest du von Datenbank-Index oder allgemein Listen-Index?

Du benutzt da die Indizes (bzw IDs) genau richtig, du solltest sie aber nicht nutzen, um zB auf irgendeine Liste in deinem Java-Programm zuzugreifen.
 

bruce85

Bekanntes Mitglied
Wenn ich jetzt in Tabelle1 ein Paar Kategorien hinzufüge, dann haben die ja eine feste id also Index und wenn ich jetzt in Tabelle2 ein Paar Einträge hinzufüge, dann haben die Einträge auch eine zugeordnete Kategorie ID, diese dann in der Spalte cat_id stehen in der Tabelle2.
Die Tabelle2 hat auch einen Index aber nicht die cat_id, also verstehe ich nicht was da nicht in Ordnung sein sollte.

So frage ich dann alle Einträge von Tabelle2 ab, die die Kategorie ID 2 haben:
Java:
String selectQuery = "SELECT * FROM tabelle2 WHERE cat_id=2 ORDER BY sort_id ASC";

Gruss
 

mrBrown

Super-Moderator
Mitarbeiter
In der Datenbank ist ja auch alles in Ordnung.

Ich meinte, den Index einer zB ArrayList gleichzusetzen mit dem Datenbank-Index
 

bruce85

Bekanntes Mitglied
Achso, ja das hatte ich mal versucht, aber ging irgendwie nicht und sollte ja auch nicht Sinnvoll sein, den Index zu verändern.

Ich danke Dir für die antworten.

Gruss
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
U SQLite-Datenbank Probleme Android & Cross-Platform Mobile Apps 8
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
B Android SQLite Tabelle neue Spalten hinzufügen Android & Cross-Platform Mobile Apps 8
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
K Null-Pointer-Exception in ListView - wird über Datenbank gefüllt Android & Cross-Platform Mobile Apps 1
N Android Ich kann mit meiner App nicht auf die Datenbank zugreifen Android & Cross-Platform Mobile Apps 4
J Android Probleme mit der Realm Datenbank Android & Cross-Platform Mobile Apps 3
M App Datenbank Server Android & Cross-Platform Mobile Apps 5
J Android Datenbank Klasse nur für CRUD-Operation, oder auch mehr ? Android & Cross-Platform Mobile Apps 8
B Android Probleme mit Realm Datenbank Android & Cross-Platform Mobile Apps 2
W Gezielte Ausgabe von abgefragten Inhalt aus Datenbank Android & Cross-Platform Mobile Apps 1
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
EisKaffee Android Datenbank auf real Device Android & Cross-Platform Mobile Apps 4
S Dynamische EditText View eingaben in Datenbank speichern Android & Cross-Platform Mobile Apps 0
D Android-App Datenbank Android & Cross-Platform Mobile Apps 4
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
F Android Datenbank upgrade wird nicht durchgeführt Android & Cross-Platform Mobile Apps 2
P J2ME - Anbindung an externe Datenbank Android & Cross-Platform Mobile Apps 3
M Welche Datenbank für J2ME? Android & Cross-Platform Mobile Apps 5
M Datenbank Android & Cross-Platform Mobile Apps 2
S Listview Einträge aus "xml" Datei Android & Cross-Platform Mobile Apps 1
A Kalendar Einträge Android & Cross-Platform Mobile Apps 7

Ähnliche Java Themen

Neue Themen


Oben