Hallo Marco,
das Thema Datum will ich auch noch mal als Tutorial bauen - gerade im Zusammenspiel mit der SQLiteDB gibt es dort ein paar Schwierigkeiten, weil die DB kein Date-Field unterstützt, dafür sind die Integerfelder groß genug für long-Values.
KORREKTUR: es gibt in der SQLiteDB Funktionen für Datumsangaben - ich lasse meine Speicherung als INTEGER aber stehen. (Danke @killphil / s.u.)
Typischer Anfängerfehler: du hast das Datum als String in der Datenbank gespeichert und ärgerst dich jetzt mit den ganzen Datumsangaben rum.
Zunächst der Hinweis: du brauchst eine neue DB-Version und den onUpgrade der Datenbank um die Inhalte des Datumsfeldes umzustellen - aber dazu später mehr.
Datum als long speichern:
Die Klassen Date und Calendar können beide auf eine long-Variable umgerechnet werden: dateObj.getTime() oder calendarObj.getTimeInMillis() - diese Zahl kannst du wunderbar in der DB als INTEGER speichern und sortieren.
Wenn du deine Daten wieder ausliest, dann musst du mit new Date(longvalue) bzw. calendarObj.setTimeInMillis(longvalue) diese Zahl wieder in deine Objekte schreiben.
Datumsangaben nutzen:
Du möchstest eine Grafik darstellen mit Datumsangaben auf der X-Achse - das wird eng, wenn du immer dd.mm.yyyy anzeigen willst. OK - du könntest senkrecht schreiben, aber sinnvoller ist es, nur den dd.mm anzuzeigen. Hängt davon ab, wieviele Einträge du darstellen willst.
(Nebeninfo: Zeichnen eines guten Koordinatensystems war Teil meiner Diplomarbeit vor 25 Jahren, damals in FORTRAN und so was wie LineGraphView musste ich komplett selber aus Linien und Texten zusammensetzen).
Primärschlüssel SQLiteDB:
Der Primärschlüssel deiner DB sollte bitte definiert werden als BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT" - die SQLiteDB mag gerne _id als Primärschlüssel. Danach kannst du dann auch sortieren und vor allem kannst du mit diesem long-Value sehr gut in deinem Programm umgehen - da könntest du Geschwindigkeit gewinnen.
Für alle, die mal eine Datenbank-Vorlesung gehört haben:
ja, es gibt andere Verfahren für Primärschlüssel - aber die SQLiteDB ist nur eine einfache Datenbank und sollte nicht mit zu viel Abstraktion gesehen werden - es geht hier ja um den schnellen Einsatz in Android und nicht um ausgefeilte Datenbank-Konzepte.
Und was ist mit onUpgrade?
Deine Kunden haben schon Daten gespeichert und möchten die auch gerne behalten - du musst die Umstellung der Datenbank (_id zufügen und füllen, Datumsangaben von TEXT auf INTEGER umstellen) also mit den alten Daten machen.
Dazu solltest du am besten eine neue Tabelle anlegen und die alte als "Datenmüll" bis zur übernächsten Datenbankversion noch behalten, dann kannst du sie löschen.
In dem onUpgrade musst du dann die Daten der alten Tabelle auslesen (mit den alten Methoden) und in die neue Tabelle schreiben (mit neuen Methoden, aber_id wird bei INSERT automatisch gesetzt, also nicht in den Values für db.insert() einbauen - einfach weglassen, die _id kommt als Ergebnis vom insert und kann im Datensatz nachgetragen werden).
Bevor du das aber in onUpgrade alles implementierst, mach dir lieber eine eigene Funktion, die die Daten überträgt. Diese Funktion kannst du dann so lange testen, bis deine Daten korrekt übernommen werden.
Dann mache die Anpassung für die Release-Version und teste die auch gründlich! Die Kunden werden es dir danken...
Fehlermeldung mit Cursor:
Du musst einen Cursor auch wieder mit close() schließen - und wahrscheinlich hast du viel zu viele Cursor geöffnet, normalerweise sollte man den Cursor nur öffnen, Daten übernehmen und dann close.
Man kann auch direkt auf dem Cursor arbeiten, aber die Zugriffsmethoden für die Felder sind sehr unhandlich, darum lieber in eine eigene Datenstruktur übernehmen (und diese Daten dann auch die ganze Zeit nutzen und eher selten neu laden).
@killphil: Danke für die Cursor-Fehlermeldung - die hatte ich nicht gefunden - konnte das noch ergänzen.
LG
Uwe