Datenbank Eintrag verschieben

  • Hallo.
    Wie ihr im Anhang seht, möchte ich eine liste erstellen in der ich die Einzelnen punkte sortieren kann. Alle werte aus der Liste sollten zudem in einer Datenbank gesichert werden.
    Wenn ein Row aus der Liste ausgewählt ist kann am diesen mit den Pfeiltasten in der Liste verschieben.
    Die Datenbank habe ich schon weitgehend fertig aber wie mache ich das mit dem Verschieben jetzt. Meine Idee:
    Die Datenbank verfügt auch über eine Spalte namens Sort_Nummer in der die Stellung in der Liste festgehalten wird. Das Problem ist nur das bei dem Verschieben eines Wertes alle Daten darunter in ihrer Nummer aktualisiert werden. Ich müsste quasi einen Datenbank Eintrag verschieben. Wie ist das zu Bewerkstelligen ?


    Ein Link zu einem Tutorial würde mir reichen. Eigentlich sehe ich diese Funktion in vielen Apps als muss das irgendwie gehen.


    Danke

  • Hallo!


    Meiner Meinung nach ist das recht simpel. Wie du schon geschrieben hast, musst du jedem Datensatz (eine Zeile/Row) eine eigene aufsteigende ID verpassen, welche in ihrem Aufstieg die Sortierung (Reihenfolge) wiedergibt. Wenn du jetzt einen Satz an eine andere Stelle verschiebst, dann wird nicht tatsächlich die eigentliche Zeile verschoben, sondern die zu verschiebende Zeile ausgelesen, gelöscht, die IDs der darüber oder drunter liegenden Rows (ich nenne es (Daten)Sätze) angepasst und dann die Zeile mit der neuen ID in die DB geschrieben:


    1. Den zu verschiebenden Satz zwischenspeichern (also in ein Hilfsarray oder Hilfsobjekt einlesen)
    2. Diesen Satz aus der Tabelle löschen
    3. Die Sätze zwischen der Quell-ID (der zu verschiebende Satz) und der Ziel-ID (da, wo der Satz hin soll), entsprechend anpassen, sprich, deren ID ändern
    4. In deinem zwischengespeicherten Satz die ID auf die neue ID ändern
    5. Den zwischengespeicherten Satz mit neuer ID in die DB schreiben


    Beispiel(tabelle):
    ID | Nr | Text
    1 | 1 | Hallo
    2 | 2 | Tag
    3 | 3 | Wetter
    4 | 4 | Sonne
    5 | 5 | Regen
    6 | 6 | Wind
    7 | 7 | Hagel
    8 | 8 | Sturm


    Wenn man jetzt den Satz (2 |2 | Tag) an die Stelle 6 verschieben möchtest, dann sieht das so aus:


    1. Den Satz mit der ID 2 aus der Tabelle auslesen und zwischenspeichen
    2. Den Satz mit der ID 2 aus der Tabelle löschen
    3. Mit einer Schleife aus allen Sätzen ab ID 3 bis ID 6 die IDs auslesen, um eins verringen und die IDs entsprechend neu in die Sätze schreiben. Aus Satz 3 wird dann 2, aus 4 dann 3, aus 5 wird 4 und aus 6 wird dann 5. Die neue Zwischen-Tabelle sieht zu diesem Zeitpunkt dann so aus:


    ID | Nr | Text
    1 | 1 | Hallo
    2 | 3 | Wetter
    3 | 4 | Sonne
    4 | 5 | Regen
    5 | 6 | Wind
    7 | 7 | Hagel
    8 | 6 | Sturm


    Der Satz mit der ID 6 fehlt hier, da er ja die ID 5 bekommen hat, usw. Weiter geht es dann so:


    4. Die ID des zwischengespeicherten Satzes änderst du nun auf die Ziel-ID, sprich, auf 6 ab.
    5. Dann schreibst du den zwischengespeicherten Satz komplett in die Datenbank. Die Tabelle sieht dann so aus:


    ID | Nr | Text
    1 | 1 | Hallo
    2 | 3 | Wetter
    3 | 4 | Sonne
    4 | 5 | Regen
    5 | 6 | Wind
    6 | 2 | Tag
    7 | 7 | Hagel
    8 | 6 | Sturm


    Die Werte des Satzes (sprich, Nr und Text) sind unverändert. Nur die IDs haben sich verändert. Man muss halt immer nur schauen, dass man die IDs bei allen Sätzen zwischen den zu verschiebenden Satz und der Ziel-Stelle an die neue Sortierung anpasst. Wenn man eine Zeile nach unten verschiebt, werden alle IDs zwischen Quell- und Ziel-ID um 1 verringert (-1). Wenn man eine Zeile nach oben verschiebt, werden alle IDs dazwischen um 1 erhöht (+1). Wichtig ist, dass die Schleife beim letztern Fall dann anders herum laufen muss. Man beginnt also immer mit dem Satz/ID, welcher direkt an die zuvor gelöschte Zeile angrenzt und zählt dann schrittweise zur Ziel-ID hin.


    Die DB-Befehle die du dazu benötigst (ich gehe mal davon aus, dass du SQLite verwendest), sind


    SELECT, um Sätze auszulesen (die zu verschiebende Zeile auslesen)
    DELETE, um Sätze zu löschen (löschen der zu verschiebenden Zeile)
    UPDATE, um Daten in Sätzen zu ändern (die IDs ändern, die zwischen Quell- und Ziel-ID liegen)
    INSERT, um Sätze zu schreiben (die zu verschiebende Zeile wieder einfügen, mit neuer ID)


    (schau mal hier: http://www.ruhrtaler-softwares…egen-aendern-und-loeschen )


    Ich hoffe, dass dir meine Erläuterungen aufzeigen, wie das Problem zu lösen ist. Einen Code (ich fange selbst erst gerade mit Android an ... ich kenne mich aber mit Programmierung und Datenbanken aus) kann ich dir aber leider (noch) nicht anbieten.


    Gruß

  • Wow. Danke für die Ausführliche Erklärung.


    Ich dachte immer das eine ID Unveränderlich sein sollte, und das nur die Nummer verändert wird.
    Ich werden mir jetzt mall überlegen wie die schleife aussehen muss.
    Bei weiteren Problemen werde ich diese hier posten. Danke :P

  • und hier sind die ersten probleme:
    Wie füge ich den Bitte einen Datensatz mit einer festgelegten ID ein und wie ändern ich die ID eines Datensatzes?
    Normalerweise füge ich ja einen Datensatz wie folgt ein:

    Java
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NUMMER, 2);
    initialValues.put(KEY_TITLE, "Tag");
    
    
    return mDb.insert(DATABADE_TABLE, null, initialValues);


    Hier ein der Link zur DOKU.


    Wie ändere ich die ID eines Datensatzes ???

  • Hallo!


    Welche Datenbank verwendest du denn? Wegen der Andoid-eigenen DB SQLite gehe ich mal von SQLite aus:


    Ändern eines Datensatzes in der Datenbank erfolgt mit dem UPDATE-Befehl.
    Datensätze löschen macht man mit dem DELETE-Befehl.
    Einen Datensatz einfügen macht man in der Regel mit INSERT.


    Da ich jetzt keine DB-Schulung machen kann, empfehle ich dir, dieses SQLite-Tutorial (so nenne ich es einfach mal) zu studieren. Da ist alles zu SQLite und eben auch zu den von mir genannten Befehlen gut erklärt:
    -> http://www.ruhrtaler-softwareschmiede.de/bitmagie/sqlite


    Gruß


    EDIT/NACHTRAG
    Das Tutorial enthält nur die reine SQL-Syntax. Wie das in Java für Android ausschaut, findest du hier:
    -> http://www.android-developing.…e-android-tutorial-part-1


    Da sind auch die Befehle INSERT, UPDATE und DELETE in der Android-Java-Syntax erklärt.


    EDIT/NACHTRAG 2
    Zum Einfügen verstehe ich dein Problem nicht. Du musst doch irgendwann einmal die Tabelle mit deinen Datensätzen gefüllt haben. Dabei hast du doch auch eine ID mit angegeben. Genauso vergibst du beim erneuten Einfügen deine ID. Falls du eine Datenbank-interne ID meinst, die dass DB-System vergibt: Die kannst du vernachlässigen in deinem Fall. Arbeite einfach mit einer eigenen ID. Es ist halt nur wichtig, dass du auf die Datenintegrität achtest. So würde es Sinn machen, die ID per Constraint als UNIQUE zu deklarieren. Dann kann eine ID auch immer nur einmal vorkommen. Was Constraints sind, ist in der bereits weiter oben verlinkten Seite gut erkärt:
    -> http://www.ruhrtaler-softwares…/sqlite-tabellen-erzeugen


    Ja, eine ID sollte von der Idee die dahinter steht nicht verändert werden. In deinem Fall (dein Screenshot) ist eigentlich die Nr deine ID. Tausche die Begrifflichkeiten aus, aber die Idee die hinter der Art, wie man Zeilen verschiebt, bleibt die gleiche.


    EDIT/NACHTRAG 3
    Es gibt sogar HIER IM FORUM ein SQLite-Tutorial:
    -> Der Umgang mit SQLite

  • SELECT, um Sätze auszulesen (die zu verschiebende Zeile auslesen)
    DELETE, um Sätze zu löschen (löschen der zu verschiebenden Zeile)
    UPDATE, um Daten in Sätzen zu ändern (die IDs ändern, die zwischen Quell- und Ziel-ID liegen)
    INSERT, um Sätze zu schreiben (die zu verschiebende Zeile wieder einfügen, mit neuer ID)


    Hallo KuJo
    Ich habe einen einfacheren weg gefunden um einen Datenbank Eintrag um eine Stelle zu verschieben. Wie du am Anfang des Beitrags im Anhang siehst kann man einen Eintrag mit den Buttons immer nur um eine Stelle verschieben. Deswegen benötige ich keine Schleife und muss auch keine Datenbankeinträge löschen. Hier mein Ausgearbeiteter Code:

    Java
    String ATitel = Wert aus Datenbank des zu verschiebenden Datensatzes (ID)
    Int ANummer = Wert aus Datenbank des zu verschiebenden Datensatzes (ID)
    String BTitel = Wert aus Datenbank des Datensatzes unter dem zu verschiebenden Datensatzes (ID+1)
    Int BNummer = Wert aus Datenbank des Datensatzes unter dem zu verschiebenden Datensatzes (ID+1)
    mDbHelper.updateNote(ID, BTitel, BNummer);
    mDbHelper.updateNote(ID+1, ATitel, ANummer);
    // mDbHelper ist meine Datenbank Helfer Klasse


    Mit diesem Code kann ich bequem einen Dateneintrag um eine Stelle verschieben B-) .


    Habe ich richtig gedacht oder ist da noch ein Fehler ?

  • Hi,


    Deswegen benötige ich keine Schleife


    Glaub ich kann dir nicht ganz folgen. Du änderst da den Datensatz, den du verschieben willst und den Datensatz auf den du ihn schiebst schubst du eins weiter runter. Aber da eins weiter drunter kann doch nochmal was sein?
    Ich denke schon, dass du eine Schleife brauchst. Dann stellt sich die frage wie viele Datensätze du da hast, denn deine Variante wird wie KuJo schon sagte schnell alles andere als performant.


    Gruß,
    matze

  • Javadoc:


    Dein Wert für "orderBy" ist null, also nein. Kann natürlich trotzdem mal rein zufällig "richtig sortiert" raus kommen.


    Um die Jetzt nach ID zu sotieren muss ich also nur folgendes tun:

    Java
    public static final String KEY_ROWID = "_id";
    return mSDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE}, null, null, null, null, KEY_ROWID);


    So einfach???

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!