Umgang mit Query

  • Guten Tag
    ich habe in einer App eine Datenbank erstellt und möchte mir nun alle Werte einer Spalte zurück geben lassen, aber erst mal als Variable speichern, um dann damit zu arbeiten.
    Wenn ich jetzt query benutze, dann schreibe ich ja als ersten Eintrag in die Klammer den distinct wert als boolean da habe ich true. Dann schreibt man den Namen der Datenbank dann die Namen der Spalten und dann die Zeilen id oder halt null wenn man alles Zeilen haben will.
    Wenn ich jetzt null reinschreibe, wie kann ich dann in meiner Activity alle Werte in eine oder mehrere Variablen speichern, wenn ich noch nicht weiß, wie viele Zeilen es gibt. Oder wie bekomme ich die höchste Zeilen id oder die Anzahl der Zeilen raus, um dann mit einer For Schleife zu arbeiten?
    Ich hänge schon das ganze Wochenende an diesem Problem...
    Vielen Dank schon mal im Vorraus
    Marco

  • Wenn du eine Query absetzt, bekommst du einen Cursor mit den Datensätzen zurück.


    Um die Daten zu speichern brauchst du eine dynamische Liste, denn dabei ist es egal, wieviele Einträge kommen, also z.B. eine ArrayList<String> (oder statt String eine eigene Klasse, die mehrere Spalten in einem Objekt speichert). Die Zeilenzahl bekommst du mit cursor.getCount() - aber wenn du nur die Daten auslesen willst, brauchst du das nicht.

    Java
    public ArrayList<String> getDatensaetze() {
    	Cursor cursor = getReadableDatabase().query( ...deine Abfrage...);
    	ArrayList<String> datensaetze = new ArrayList<Datensatz>();
    	while (cursor.moveToNext()) {
    		datensaetze.add(cursor.getString(0));
    	}
    	cursor.close();
    	return datensaetze;
    }
  • Hey vielen Dank hat mir schon super geholfen. Nur eine Frage hätte ich noch. Der beachtet den ersten Eintrag in meiner DB nicht. Also wenn ich einen Eintrag drin habe gibt der mir zurück das die Größe 0. Wenn in meiner DB zwei Einträge sind gibt der mir 1 als Größe zurück. Das verstehe ich nicht. Ich hänge einfach noch mal den Code an den ich bisher habe:
    Hier den des DB-Adapters:

    Java
    public Cursor fetchPreis(){
    		Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_PREIS}, null, null, null, null, null, null);
    		if(mCursor != null){
    			mCursor.moveToFirst();
    		}
    		return mCursor;
    	}


    Und hier der mit dem ich dann die ArrayList erstelle und dann zum Test mal die Größe des Array ausgebe:

  • sorry, musste alles noch mal ändern, hatte was übersehen:


    du rufst moveToFirst auf - dann springt der spätere Aufruf moveToNext schon auf den zweiten Datensatz - und dir fehlt dann der erste.


    Im Anfang steht der Cursor nämlich _vor_ dem ersten Element (cursor.isBeforeFirst() == true bzw. cursor.moveToPosition(-1)) und moveToNext liest dann den ersten Eintrag.

    Das Leben kann so hart sein, man muss nur richtig wollen!!!

    2 Mal editiert, zuletzt von UweApps () aus folgendem Grund: Fehler gefunden

  • ich glaub, über den Punkt stolpern noch einige, ich musste auch erst mal genau nachschauen, bis ich gefunden hab, dass -1 ein gültiger Wert bei moveToPosition ist.


    Zuerst hatte ich nämlich noch einige andere Vorschläge zum weiteren Testen, wollte auch nachfragen, wie du die Daten in die DB reingeschrieben hast - dort vermutete ich einen Fehler bei _id oder ähnliches. Erst als ich meinen Datenbankcode noch mal angeschaut hab, fiel mir auf, dass der moveToFirst noch dazwischenfummelte.


    Hoffentlich haben wir jetzt die richten Stichworte drin, dass andere die Lösung auch finden. 8)

  • Ja das ist schon so eine Sache zumal ich Dbs noch nicht in der Schule hatte und bisher eher so im Halbwissen darüber bin. Und ich wusste gar nicht das es so eine ListArray gibt aber sau praktisch. Ich hoffe auch das auch andere mit deinen Tipps ihre Probleme lösen können.

Jetzt mitmachen!

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