Bei DELETE nur 1 Record löschen

  • Moin moin


    Ich lese schon ne Weile hier mit und hab schon ein paar brauchbare Tipps lesen können.
    Hab mich jetzt angemeldet, da ich ein Problem habe, für das ich noch keine Lösung gefunden habe.


    Und zwar möchte ich bei meiner App einen Record aus der Datenbank löschen, allerdings nur einen, denn der Record kann in der Form mehrfach vorhanden sein.
    Mein Delete-Befehl sieht momentan so aus:

    Code
    myDB.execSQL("DELETE FROM" + Noten + " WHERE fach='" + inp + "' AND note='" + ClickedItem + "';");


    Ich habe versucht mit LIMIT 1 das gewünschte Ergebnis zu erzielen, also so:

    Code
    myDB.execSQL("DELETE FROM" + Noten + " WHERE fach='" + inp + "' AND note='" + ClickedItem + " LIMIT 1';");


    Jedoch hat das nicht funktioniert, da es dann zu einer SQLiteException kommt. Ich weiss leider nicht wie ich das ganze Zeugs aus der LogCat bekomme, deshalb schreib ich hier nur die betreffenden Zeilen (ohne den Stacktrace) hin:
    Failure 1 (near "LIMIT" : syntax error) on 0x11d400 when preparing 'DELETE FROM Noten WHERE fach='Mathe' AND note='4.5' LIMIT 1;'.
    Shutting down VM
    android.database.sqlite.SQLiteException: near "LIMIT" : syntax error: DELETE FROM Noten WHERE fach='Mathe' AND note='4.5' LIMIT 1;


    Kann mir jemand helfen, wo mein Problem ist?


    Gruss, FireRider

  • Nimm mal anstatt "LIMIT 1" "LIMIT 0,1"
    Denn bei LIMIT ist der erste "Parameter" der Startwert mit 0 als erstes Element und der zweite die Anzahl der Elemente.
    Bei dir also 0 als Startwert und nur 1 Element ;)


    Hoffe es klappt dann ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Nimm mal anstatt "LIMIT 1" "LIMIT 0,1"
    Denn bei LIMIT ist der erste "Parameter" der Startwert mit 0 als erstes Element und der zweite die Anzahl der Elemente.
    Bei dir also 0 als Startwert und nur 1 Element ;)


    Hoffe es klappt dann ;)


    Danke für die Antwort, aber leider klappt es immer noch nicht. Es kommt der gleiche Fehler, einfach dass steht LIMIT 0,1 anstatt nur LIMIT 1.

  • Also generell ist es empfehlenswert jeden Datensatz eindeutig indentifizieren zu können. Alles andere ist i.d.R. schlechtes Datenbankdesign und führt zu Problemen, wie deinen jetzt. Mach doch einfach ne laufende Nummer zu jedem Datensatz, über die du ihn eindeutig ansprechen kannst. Dann löscht du immer den richtigen [lmgtfy]Primary Key[/lmgtfy]

  • Das ist mir klar, ich habe auch eine ID für jeden Datensatz.
    Momentan habe ich noch alle Datensätze in einer Tabelle, werde sie noch aufsplitten, dann werd ichs über die ID machen.
    (Kann man in einer ListView den Index des angeklickten Items herausfinden? Also bei einem OnItemLongSelectedListener)

  • Also in diesem Beispiel hast du ein Beispiel in Punkt 4.
    Und der ListView sollte ja die gleichen IDs haben, wie in der Datenbank. Oder vielleicht kann man sie auch mitschicken.


    Hoffe es hilft.


    Danke, dass man beim onItemClick die id und die position mitbekommt hab ich ganz vergessen :)


    Die Position ist die Stelle an der angezeigten Position (z.B. 2 für dritte von oben) und die id der Identifier für den Datensatz (also so wie ein autoincrement primary key in der DB) oder?


    Also auch wenn ich ein Item aus der Liste lösche, wird die ID gleich sein wie in der DB?

  • Also auch wenn ich ein Item aus der Liste lösche, wird die ID gleich sein wie in der DB?


    Dann würde das Ganze ja nicht mehr passen. Haste recht! Hab es allerdings nicht überprüft.
    Am Anfang hast du:
    DB:
    0 1 2 3
    Und die Liste:
    0 1 2 3


    Wenn du jetzt also Nummer 2 löschen solltest, dann müsste der Durchgang danach doch so aussehen:
    DB:
    0 1 3 4
    Und die Liste:
    0 1 2 3


    Passt dann also nicht mehr...

  • Jo, das habe ich gestern Abend mal noch ausprobiert. ID war immer von 0-...
    Wieso kann man dann Position und ID angeben bei onClick()? Ist ja beides das gleiche (ausser halt int und long).
    Hat sonst jemand eine Idee wie man Records die vom Inhalt mehrmals vorkommen können eindeutig identifizieren kann(über die ListView)?

  • könnte man evt. nicht auch ein Array machen, in welchem dann die Daten stehen, also im Prinzip die Speicheradresse für das Element und es darüber auch wieder identifizieren?
    Die Idee kam mir grade so. In wie weit man das auch umsetzen kann weiß ich bei android nicht genau. Hoffe aber, dass es geht und du damit erfolg hast ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

Jetzt mitmachen!

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