Probleme mit CursorOutOfBoundsException

  • Hallo,


    ich habe diesen Code geschrieben und bekomme einen android.database.CursorOutOfBoundsException Error, weiß aber nicht woran das liegen könnte.
    Ich möchte für jeden Wert in der db den Wert von "daysRemain" auslesen, bearbeiten und updaten. Und das halt solange, bis alle Einträge bearbeitet wurden (also der Cursor null ist)


    im LogCat wird folgendes ausgegebenIn der db befinden sich auch 4 Einträge die bearbeitet werden müssen.
    Hat jemand eine Vermutung, wo der Fehler liegen könnte?
    Vielen Dank im voraus, Merlinus

  • Hallo
    Erstmal solltest du den Code in den Code Block als Text posten, und nicht als Bild.
    Ohne Zeilen Nummer ist es schwerer dir zuerklären wo du was falsch machst.



    While (c !=null)


    Ist eine endlos schleife.



    Die Id ist normalerweise ein Long.

  • Hallo, danke schonmal.
    Hier ist der Code als Text.


    Warum ist denn while(c!=0) eine endlos schleife? Hatte das in nem Tutorial gesehen und da hat es funktioniert (kann aber sein, dass das schon älter war)
    Ich möchte halt, dass er die schleife solange ausführt, bis er das für jede Spalte gemacht hat. Kann ich denn sonst irgendwie checken, wann der Cursor an der letzten Position ist?
    Würde das mit einer Kombination aus .getPosition() und .getCount vielleicht gehen?


    Also so in der Art


  • Zitat

    Warum ist denn while(c!=0) eine endlos schleife?


    Dann überlege mal was c ist ein Objekt. Das Objekt ist nicht „null“
    Innerhalb der Schleife wird die Instanz des Objektes nicht verändern oder sogar gelöscht.
    Geht nie auf „null“ somit ist die While Bedingung immer true. Wird nie beendet.


    Der Code von dir sollte gehen ich würde es etwas kürzer machen.


    Code
    if (c.getCount() != 0){
        c.moveToFirst();
        do {
    			...
    			
        } while (c.moveToNext());
    }
  • Habe deinen Code versucht. Jetzt kommt zwar nicht mehr der CursorOutOfBoundsException Error, aber es funktioniert trozdem nicht und das Logcat gibt mir folgendes aus:


    2020-04-06 20:19:31.343 1750-4301/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 12461258 , only wrote 12461172


    2020-04-06 20:19:31.427 1789-1997/? D/AF::Track: interceptBuffer: took 600us to intercept 0 tracks
    2020-04-06 20:19:31.630 1750-4301/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 12473801 , only wrote 12473731


    2020-04-06 20:19:31.646 1750-4301/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 12474439 , only wrote 12474392


    2020-04-06 20:19:31.788 1750-4301/? W/audio_hw_generic: Not supplying enough data to HAL, expected position 12480683 , only wrote 12480341


    Zumindest kommt das, wenn ich auf den entsprechenden Button klicke. Keine Ahnung was der mit audio zu tun haben soll...


    Ps: mit meinem Code funktioniert es leider auch nicht. Da kommt auch der CursorOutOfBoundsException Error :(

  • Das ist der neue Code

  • Was du in der actualDaysRemain Variablen hast ist der Index der Spalte und nicht der inhalt der von der Zelle. Also nicht das Datum.


    Da bringst du immer noch alles durcheinander? Hatten wir doch schon alles mal.


    Eigentlich kennst du ja deine Tabelle und weißt auch wo in welcher Spalte deine Werte sind. Also könntest du auch gleich die Spalten Nummer beim Zellen auslesen benutzen.


    getColumnIndex gibt dir die Spalten Nummer nicht den Zellen Inhalt.

  • Ok, was ich verstanden habe ist, dass ich immer mit c.getInt(c.getColumnIndex("...")); den Inhalt auslesen muss.
    Oder halt mit c.getString(c.getColumnIndex("..."));


    Das mit den ContentValues ist ein Problem. Kann man das irgendwie machen, dass der das in einer Schleife immer überschreibt?


    Es ist nämlich so, dass ich aus meiner Datenbank alle Vokabeln auslesen möchte und bei jeder einzelnen davon (wo der Inhalt der Zelle >0 ist) -1 rechnen möchte und den neuen Wert wieder updaten möchte( um halt aus z.B. 5 Tagen bis die Vokabel wieder kommt, 4 Tage zu machen).
    Da der Nutzer selbst Vokabeln einfügt, weiß ich auch nicht wie lang meine Datenbank ist (bzw. schon mit .getCount() aber ich kann ja nicht einfach hunderte ContentValues erstellen)


    vorher (als ich noch mit SharedPreferences die Zahlen in einer Int-List gespeichert hatte) war der Code einfach


    Code
    for(int i, i<daysRemain.length,i++)
    daysRemain[i]--;

    Das Prinzip möchte ich halt mit den Werten in der Spalte daysRemain aus meiner Tabelle machen.
    und dann halt die neuen Werte auch wieder updaten.

  • Eigentlich sollte es beim Update gehen, wenn du nur ein Wert in dem ContentValues hast.
    Auch das mit der Where Klausel müsste gehen.
    Aber die ID ist ein Long und nicht ein Int. Also lese auch eine Long aus dem Cursor aus .



    die Fehlermeldung passt nicht zu deinem Code muss von wo anders kommen ist auch nur eine Warung und kein Error

Jetzt mitmachen!

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