Android-Programmierung SQL

Willemers Informatik-Ecke

Das einzig seriöse Javabuch :-) Mehr...

.. enthält ein Kapitel zur Android-Programmierung.
Bei Amazon bestellen
2015-11-25
Auf diesen Seiten halte ich meine Erfahrungen im Bereich der Android-Programmierung fest, um sie später nachschlagen zu können. Die Ausführungen sind kein vollständiger Kurs, manchmal nur Notizen, aber vielleicht anderen hilfreich. Android verwendet die Datenbank SQLite als Bibliothek zur Speicherung strukturierter Daten. Jede App verwaltet dabei ihre eigene Datenbank in einer lokalen Datei, die von außen nicht erreichbar ist.

Unter Android sollten unstrukturierte Daten wie Bilder oder Audios separat gespeichert werden und nicht etwa als BLOBs in der Datenbank.

Eine Tabelle sollte unter Android immer eine autoinkrementierende Spalte als Index einzurichten. Typischerweise wird diese _ID genannt. Sie wird effektiv benötigt, wenn die Daten über einen Content-Providern verbreitet werden sollen.

SQLiteOpenHelper

Es empfielt sich, die Datenbank hinter einer Klasse zu implementieren, die gegenüber der App nur die Schnittstelle für die Datenhaltung veröffentlicht. Eine solche Kontrakt- oder Helper-Klasse erweitert typischerweise die Klasse SQLiteOpenHelper.

Konstruktor

Der Konstruktor erhält den Context als Parameter, den er an den Basiskonstruktor weitergibt.

OnCreate

Die Methode onCreate erhält als Parameter die SQLiteDatabase db. Hier wird typischerweise die Datenbanktabelle durch den Aufruf der Methode db.execSQL erzeugt. Als Parameter erhält die den Befehl zur Erzeugung der Tabellen.

Zugriff

Eine existierende Datenbank kann mit den Aufrufen getReadableDatabase oder getWritableDatabase erreicht werden.

Einfügen in die Datenbank

Das Einfügen von Daten erfolgt über ContentValues. Das ist eine Container-Struktur, in der aus Spaltenname und Inhalt ein Paar gebildet wird. Eine solche Liste kann dann mit einem Rutsch über die Methode insert in die Datenbank geschafft werden.

public long insertDatumGewicht(long tag, long monat, long jahr, double gewicht) {
    long zeile = -1;
    try {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DATUM, jahr*10000+monat*100+tag);
        values.put(GEWICHT, gewicht);
        zeile = db.insert(TABELLE, null, values);
    } catch (SQLiteException e) {
        Log.e(this.getClass().getSimpleName(), "insert failed");
    }
    return zeile;
}

Auslesen der Datenbank

Das Auslesen der Datenbank erfolgt über einen Cursor. Der Cursor ist das Ergebnis einer Query-Anfrage. Auch Querys können in der OpenHelper-Klasse vordefiniert werden. Immerhin sind immer nur bestimmte Anfragen an die Datenbank erforderlich.
public Cursor query() {
    SQLiteDatabase db = getWritableDatabase();
    return db.query(TABELLE, // Die Tabelle
        null, // Die Spalten, die ausgewählt werden, als String-Array
        null, // Die WHERE-Klausel
        null, // Wenn ? in der WHERE-Klausel stehen, werden sie hier aufgelöst
        null, // Die GROUP BY-Klausel
        null, // Die HAVING-Klausel
        DATUM+" DESC"); // Die ORDER-BY-Klausel
}
Der Cursor durchläuft Zeile für Zeile die Ergebnismenge des Select-Befehls. Aus dem Cursor können verschiedene Informationen gewonnen werden. Einerseits kann die Nummer einer Spalte über den Spaltennamen ermittelt werden. Andererseits kann beim Durchlaufen für jede Zeile der Wert des Feldes ausgelesen werden. Das folgende Listing liest aus einer Datenbanktabelle Gewichte und ermittelt den Durchschnitt und stellt diesen in einem TextView dar.

try {
    GewichtDB db = new GewichtDB(this); //
    SQLiteDatabase sdb = db.getWritableDatabase();
    Cursor cursor = db.query();
    int spalteGewicht = cursor.getColumnIndex(GewichtDB.GEWICHT);
    double summeGewicht = 0.0;
    int anzahl = 0;
    while (cursor.moveToNext()) {
        double gewicht = cursor.getDouble(spalteGewicht);
        summeGewicht += gewicht;
        anzahl++;
    }
    if (anzahl > 0) {
        tvDurchschnitt.setText("" + summeGewicht / anzahl);
    } else {
        tvDurchschnitt.setText("nix");
    }
    cursor.close();
} catch (SQLiteException e) {
}

Homepage (C) Copyright 2015 Arnold Willemer