German SQL Datensatz löschen

peternmb

Well-Known Member
Licensed User
Longtime User
Halle,

ich möchte aus meiner SQL-Tabelle einen Datensatz löschen, erhalte aber eine Fehlermeldung die mir nichts sagt:
android.database.sqlite.SQLiteException: unrecognized token: ":" (code 1): , while compiling: DELETE from table2 WHERE H_Eintrag=Titel: Titel: Advent fängt im September an
Der zu löschende Eintrag wird dabei durch ein langes Drücken in einem ListView (Bezeichnung zeig) markiert. Mein Code:
B4X:
Sub zeig_ItemLongClick(Position As Int, Value As Object)
    '
    Msgbox2Async("Soll dieser Eintrag "&CRLF&CRLF&Value&CRLF&CRLF&"wirklich gelöscht werden?","Systemfrage","Ja","","Nein",Null,False)
    Wait For Msgbox_Result (result As Int)
    If result = DialogResponse.POSITIVE Then
        SQL1.ExecNonQuery("DELETE from table2 WHERE H_Eintrag=" & Value)
    End If
    '
    pnl1.RemoveAllViews        'Fenster schliessen
    pnl1.RemoveView
    PnlBlack.RemoveAllViews
    PnlBlack.RemoveView
   '
End Sub

Außer dem möchte ich eine bestimmte Anzahl Einträge, die einen Maximalwert überschreiten löschen, wie formuliere ich das am Besten?
Es sollen z.B. wenn der Maximalwert 50 ist und die Tabelle 80 Datensätze enthält die ersten 30 gelöscht werden.
 

OliverA

Expert
Licensed User
Longtime User
Anstatt
B4X:
SQL1.ExecNonQuery("DELETE from table2 WHERE H_Eintrag=" & Value)
Benuetze
B4X:
SQL1.ExecNonQuery2("DELETE from table2 WHERE H_Eintrag=?", Array As Object(Value))
Warum? Siehe "Prepared Statements" hier: https://www.ionos.de/digitalguide/server/knowhow/mysql-lernen-leicht-gemacht/

Einfache Loesung: Value muss mit Anfuehrungszeichen eingeschlossen werden, aber die einfache Loesung kann unter SQL injection leiden.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Danke OliverA, so funktioniert es jetzt :)

Ich habe die Datenbank jetzt noch um ein autoincrement-Feld "ID" ergänzt um so einfacheren Zugriff z.B. zum Löschen auf einen bestimmten Datensatz zu erhalten.
Wie kann ich erreichen, dass diese Satznummern z.B. nach dem Löschen aktualisiert werden - anscheinend geht das nicht automatisch?

Gibt es da eine einfachere Variante?
In der Welt der relationalen Datenbanken aus der ich komme kann ich einen bestimmten Datensatz einfach und ohne Zusatzfelder mit recno() anspringen.
 
Last edited:

pucki

Active Member
Licensed User
Danke OliverA, so funktioniert es jetzt :)

Ich habe die Datenbank jetzt noch um ein autoincrement-Feld "ID" ergänzt um so einfacheren Zugriff z.B. zum Löschen auf einen bestimmten Datensatz zu erhalten.
Wie kann ich erreichen, dass diese Satznummern z.B. nach dem Löschen aktualisiert werden - anscheinend geht das nicht automatisch?
RICHTIG. Soll auch nicht gehen.


autoincrement-Feld "ID" ist NICHT veränderbar. I.d.R. auch nicht via Code. Es ist ein Feld was immer nur eine Richtung kennt. + 1 wenn ein NEUER Datensatz hinzu kommt.

Das ist auch Mega-Wichtig. Der Grund ist, das man damit IMMER sein Datensatz identifizieren kann. Das ist besonders wichtig wenn du mit Gittern/Tabellen arbeitet. Du lässt die ID in eine NICHT SICHTBAREN Feld mit in Gitter. Wenn der User darauf klickt, fragst du die Zelle mit der ID ab, und führst den Befehl an mit den Anhang "where ID = Inhalt_zelle_id.

Wenn du deine Datensätze nummerieren willst, dann mache es von Hand. Ist aber nicht einfach. Braucht 2-3 Befehle wenn die Liste keine Lücken haben soll.

Wenn du nur raufzählen willst mit Lücken reicht ein : ""select satz_nr from Datenbank order by satz_nr desc". Denn Wert + 1 nehmen und schon hast du die neue Datensatz-Nr.

Ich würde NIEMALS die ID für so Spielchen nutzen. Die ID soll mir die Möglichkeit geben, STRESSFREI und Sicher ein bestimmten Datensatz zu treffen.

Es gibt sogar Datenbanken (Access z.b.) die ohne ID sehr zickig sind.

Also leg deine DB so an.

ID als autoincrement-Feld , einmal
Satz_nr als Double kannst du einmalig setzen via Datenbank, dann kommt ein Fehler wenn du sie 2 x anlegst.


Den Rest nach Bedarf.

Du hast nämlich noch einen anderen Vorteil für Später. Solltest du die DB mal in eine andere Tabelle kopieren, dann brauchst du nur ein Zusatzfeld "alte_db" und hast deine Satz_nr immer noch. Die alte ID ist Geschichte.



Gruß

Pucki
 
Top