Skip to content
This repository has been archived by the owner on Nov 23, 2022. It is now read-only.

SQLite Datenbanken unter Android

Eugen Richter edited this page Mar 27, 2017 · 1 revision

SQLite unter Android

Für den Zugriff auf die SQLite-Datenbank steht unter Android die abstrakte Klasse SQLiteOpenHelper zur Verfügung. Diese Klasse regelt mit den Methoden onCreate und onUpdate die Erzeugung und Aktualisierung der Datenbank.

Von der SQLite-Datenbank werden nativ nur wenige Datentypen unterstützt. Das sind:

  • INTERGER (entspricht Long unter Java)

  • DOUBLE (entspricht Double unter Java)

  • TEXT (entspricht String unter Java)

  • BLOB ( Binary Large OBjects – reine binäre Daten, wie Bilder, Videos, Guid usw.)

Alle anderen Datentypen müssen zur Laufzeit konvertiert werden und werden meistens als Text-Datentyp intern gespeichert. Datum kann unter SQLite sowohl als Integer (Anzahl der Sekunden seit 1.1.1970), als auch als Double und Text gespeichert werden.

Die SQL-Anweisungen können mit dem DB-Parameter aus dem Helper (SQLiteOpenHelper. getReadableDatabase() oder SQLiteOpenHelper.getWritableDatabase()) auf vier Arten durchgeführt werden.

  1. db.rawQuery: Als Parameter wir der auszuführende SQL-String übergeben.
  2. db.query: Als Parameter werden dabei die Bestandteile der Abfrage übergeben.
  3. Prepared Statements: Vorkompilierte SQL Anweisungen (sehr performant im Vergleich zu den beiden anderen Methoden).
  4. Spezielle Änderungsfunktionen (update, delete, insert).

Abfrageoperationen

SQLite rawQuery

SELECT
    _id,
    start_time,
    end_time
FROM
    worktime
WHERE
    _id < 100
ORDER BY
    start_time DESC

SQLite query

db.query(
    false, // distinct?worktime// From Tabelle
    new String[] { // Select Spalten_id”,
    ”start_time”,
    ”end_time”},
    ”_id <”, // Where-Bedingung
    new String[] { // Parameter für Where100”},
    null, // Group By Anweisung
    null, // Having Anweisungstart_time DESC”, // Order By
    null); // Limit

Änderungsoperationen

SQLite rowQuery (Insert)

INSERT INTO
    worktime
    (start_time,
    end_time)
VALUES
    ('2011-07-06 08:00:00',
    '2011-07-06 17:00:00')

Spezialfunktion (Insert)

Content Values werte =
    new ContentValues();
werte.put(
    ”start_time”,
    ”2011-07-07 07:00:00”);
werte.put(
    ”end_time”,
    ”2011-07-06 17:00:00”);
db.insert(
    ”worktime”,
    null,
    werte);

SQLite rowQuery (Update)

UPDATE
    worktime
SET
    start_time = '2011-07-06 07:15:00',
    end_time = '2011-07-07 17:45:00'
WHERE
    _id = 100

Spezialfunktion (Update)

ContentValues werte =
    new ContentValues();
werte.put(
    ”start_time”,
    ”2011-07-06 07:15:00”);
werte.put(
    ”end_time”,
    ”2011-07-06 17:45:00”);
db.update(
    ”worktime”, // Tabelle
    werte, // Werte_id=?”, // Bedingung
    new String[]{”100”}); // Bedingungswerte

SQLite rowQuery (Delete)

DELETE
FROM
    worktime
WHERE
    _id = 100

Spezialfunktion (Delete)

db.delete(
    ”worktime”,
    ”_id=?”,
    new String[]{”100”});

Prepared Statements

Die Statements liefern als Ergebnis immer 1 x 1 Zelle. Somit sind diese nicht für „normale“ Abfragen geeignet, aber für spezielle Aufgaben, die nur einer einzigen Wert (z.B. SELECT count(*) …) zurückliefern oder gar kein Ergebnis notwendig ist (Update, Delete, Insert). Diese Statements werden beim Kompilieren des Projektes für SQLite kompiliert und erreichen dadurch sehr hohe Performance (ca. 4 x schnelle als rowQuery Anweisungen).

Mögliche Statements sind:

  • execute(): nicht für SELECT, UPDATE, INSERT, DELETE, aber für CREATE, DROP (Tabelle, View, Index) geeignet.
  • executeInsert(): für INSERT Anweisungen geeignet.
  • executeUpdateDelete(): Erst ab Android 2.2 verfügbar und für UPDATE und DELETE Anweisungen geeignet.
  • simpleQueryForLong(): liefert einen Integer in einer 1 x 1 Tabelle als Ergebnis. Gut für SELECT count(*) FROM table geeignet.
  • simpleQueryForString(): Arbeitet genauso wie simpleQueryForLong, liefert aber statt Integer einen Strings-Wert zurück.

Beispiel

SQLiteStatement stmInsert = db.compileStatement(
    ”INSERT INTO time_tracking ” +
    ”(_id, start_time, end_time) ” +
    ”VALUES (?,?,?)”);
stmInsert.bindLong(1,100l);
stmInsert.bindString(2,”2011-07-06 07:00:00”);
stmInsert.bindString(3,”2011-07-06 17:00:00”);
long id = stmInsert.executeInsert();

Achtung: Bei bindXXX fängt der Index mit 1 an und nicht wie in Programmiersprachen üblich, mit 0.

Links