SQLite / Next,Previous / Probleme mit Position

  • Guten Morgen
    habe wieder einmal ein Problem. Dieses mal mit der SQL Datenbank.
    Muss zugeben das ich da sehr wenig Erfahrung damit habe.
    Ich habe mir eine Test Datenbank aufgebaut mit / Add, Delete, Update , Show. Das hab ich mir mehr oder weniger aus Youtube zusammengebastelt.
    Funktioniert aber recht gut und hab ich eigentlich auch hoffentlich verstanden.
    Nun bin ich dabei mir einen Forward und Backward Knopf mit einzubauen. Also immer 1 hoch oder 1 runter zählen und Anzeigen.
    Die Forward Taste funktioniert super (position wird immer hochgezählt) aber wenn ich den Backward Knopf drücke fängt er bei 0 an anstatt bei der letzten Forward Position z.B. 4.
    Ich könnte natürlich die position Variable so definieren dass sie "global" gilt, das will ich aber erst mal nicht.
    Möchte verstehen warum es nicht geht.
    Ich dachte dass beim Hochzählen die Position in der Datenbank hochgezählt wird (cursor.moveToPosition) und nicht nur die Variable.


    Hier mal der Code von DataBaseHelper.java


    und hier der von der MainActivity

    Danke schon mal für eure Unterstützung

  • Guten Tag herm_no,


    ich hab das noch nie gesehen das man im setOnClickListener also gleich unterhalb eine Variable deklariert.
    Probier doch mal die Variable hier drunter zu deklarieren.


    Java
    @Override
                public void onClick(View v) {
    
    
                int position = etID.getText().toString().length();
    
    
    }

    Also so mach ich das immer und so bekommt auch die Variable immer den neuesten Wert. Ich glaube bei deinem Code holt er sich einmal die Position und dann nie wieder.
    Wenn ich falsch liege bitte sagt es mir :D

  • Danke für deine Antwort.
    Das hatte ich vorher schon so , diese Zeile war nur ein Test. Ist nun wieder so wie du geschrieben hast.
    Allerdings geht es immer noch nicht.
    Jetzt ist mir allerdings aufgefallen, das bei Forward auch die Position nur bis 2 zählt und dann nicht mehr Weiter. War mir erst nicht bewuss, da mein Datensatz noch so klein war.
    Das ist jetzt allerdings sehr komisch.
    Den Fehler muss ich erst mal finden.


    Gruß

  • Hey danke für deine Antwort.
    Das stimmt, den Fehler habe ich gerade selber gefunden.
    Ich habe es nun umgeschrieben.
    Hab das cursor.moveToNext und cursor.moveToPrevious gefunden.
    Jetzt aber immer noch ein Problem
    Das Forward funktioniert jetzt perfekt.
    Das Backward(Previous) allerdings immer noch nicht. (er fängt dann wieder bei -1 an anstatt beim letzten Stand von Forward)
    Der Grund ist warscheinlich dass er gegenüber Forward zu Backward eine neue SQLiteCursor@xxxx nummer zieht. Sieht man auf jeden Fall beim debuggen(weis jetzt nicht ob man das Instance nennt).
    Hab schon einiges probiert, aber finde erst mal keine einfache Lösung dafür.
    Gibt es da eine Möglichkeit, damit für beide Buttons das selbe verwendet wird, oder wie geht man da richtig vor.



  • du fragst jedes mal die Datenbank neu ab und bekommst somit immer wieder einen neuen cursor zurück der nach der Abfrage immer auf Anfang steht. Entweder du fragst die Datenbank nur ein mal ab und nicht in den Klick Methoden. Oder du setzt den cursor wider auf die alte Position.

  • Mir ist gerade beim durchlesen etwas aufgefallen ich glaube Copy Paste Fehler :D

    Code
    public void BackwardData(){
            btnBackward.setOnClickListener(new View.OnClickListener() {
                Cursor cursor = butterflyDB.forwardData();

    Beim BackwardData nimmst du den Cursor forwardData

  • Danke für eure Antworten


    Also sdo mit dem forwardData(); war ein Test und den hab ich leider in meiner Frage vergessen wieder zu korrigieren.
    Das ist leider nicht die Lösung.


    a) Wie setzte ich denn am besten den Cursor innerhalb 2 Methoden wieder auf die alte Position. Also von Forward zu Backward und Backward zu Forward.
    Das ist mir nicht so klar. bzw. mir fällt gerade nicht ein wie.




    b) wie frage ich die Datenbank nur ein mal ausserhalb der Methoden ab. Dann hätte ich doch ein Problem wenn ich z.B. zwischen durch mal ein Add, oder Update fahren würde ?

  • Andy61 nein das ist nicht der Fehler. In der Methode wird ein neuer Cursor estellt und die Datenbank neu abgefragt .
    Somit ist die Position des
    Cursors wieder am Anfang wenn dann der Cursor dekrementiert wird ist er -1.



    herrm_no wie so machst du das mit den Klick Methoden so umständlich?


    Den onklickhandler weist du erst in der Backward und Forward Methode zu wie so ?


    würde das in der onCreat machen. Wenn du das machst weil die Button erst ab einer bestimten zeit zur verfügung stehen sollen. Dann setze sie einfach inacktiv und später wieder acktiv.


    Somit hast du nur noch eine onKick Methode in dieser wierd das View mitgegeben was geklickt wurde. Über die Id kannst eine abrage mit shwitch case machen.

  • Ok, danke
    das ist ein Vorschlag den ich Verstehe und auch umsetzen könnte.
    so weit ich es richtig gelesen habe, kann man doch nur ein implements View.OnClickLisetener erstellen (Radio Button)
    Was mache ich wenn ich aber zusätzlich noch eine CheckBox und vielleicht noch eine Listbox (und auch noch eine Seekbar) habe.
    Das ist in dem Programm noch nicht enthalten. Aber ich bin mit dem kleinen Programm dabei zu testen wie ich das in meinem Hauptprogramm umsetzen kann.
    Stoße ich da wieder auf ein zusätzliches Problem.




    Gruß

  • Hi du kannst doch jedem View im XML eine id geben, und jede dann im Clicklistner prüfen.
    Ansonsten hast du immer noch die Möglichkeit dem Element einen eigenen Klicklistner zu geben.


    Du hast auch immer die Möglichkeit im XML eine KlickMetode mit zugeben
    "android:onClick="onKlick" wenn du für alle die gleiche Methode angiebst, kannst du auch die Unterscheidung über die ID machen.
    Dazu brauchst du dann den Lister nicht in der Klasse zu Implenentieren.
    Beachte das geht nur in eine Activity nicht in einen Fragmant da must du den Listner Implenentieren und kanst die
    "android:onClick=..." nicht nutzen.


    Was meinst du mit nur einen View.OnClickLisetener erstellen? Du brauchst doch auch nur einen den Widges, RadioButton ,Checkbox, Spinner ... sind alles Ellemente von der Klasse "View" somit kommen alle Klick Ereignisse auch dort an und somit in deinen Listner "public void onClick(View v)" . Deshalb ID setzen und auswerten.
    Wichtig ist,fals du es nicht weisst, immer das break am Ende der Case Anweisung, sonst läuft der Switsh weiter zu nächsten Case Anweisung wass man meistens nicht will.

  • So, ich habe deinen Vorschlag beherzigt und es Umbegbaut.
    Ich habe auch noch eine extra Klasse dafür geschrieben. (ExternalOnCLickListener)
    Nun funktioniert alles Perfekt
    Danke, Danke , Danke
    Das hat mich nun wirklich Stunden gekostet.
    Man bekommt halt nichts um sonst :) aber die Hilfe vom Forum und besonders von Dir ist unschlagbar.


    Hier mein Code für alle anderen Anfänger


    Main Activity


    Java ExternalOnClickListener

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!