SQLite Datenbanken 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
(entsprichtLong
unter Java) -
DOUBLE
(entsprichtDouble
unter Java) -
TEXT
(entsprichtString
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.
-
db.rawQuery
: Als Parameter wir der auszuführende SQL-String übergeben. -
db.query
: Als Parameter werden dabei die Bestandteile der Abfrage übergeben. - Prepared Statements: Vorkompilierte SQL Anweisungen (sehr performant im Vergleich zu den beiden anderen Methoden).
- Spezielle Änderungsfunktionen (update, delete, insert).
SELECT
_id,
start_time,
end_time
FROM
worktime
WHERE
_id < 100
ORDER BY
start_time DESC
db.query(
false, // distinct?
”worktime” // From Tabelle
new String[] { // Select Spalten
”_id”,
”start_time”,
”end_time”},
”_id <”, // Where-Bedingung
new String[] { // Parameter für Where
”100”},
null, // Group By Anweisung
null, // Having Anweisung
”start_time DESC”, // Order By
null); // Limit
INSERT INTO
worktime
(start_time,
end_time)
VALUES
('2011-07-06 08:00:00',
'2011-07-06 17:00:00')
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);
UPDATE
worktime
SET
start_time = '2011-07-06 07:15:00',
end_time = '2011-07-07 17:45:00'
WHERE
_id = 100
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
DELETE
FROM
worktime
WHERE
_id = 100
db.delete(
”worktime”,
”_id=?”,
new String[]{”100”});
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ürSELECT
,UPDATE
,INSERT
,DELETE
, aber fürCREATE
,DROP
(Tabelle, View, Index) geeignet. -
executeInsert()
: fürINSERT
Anweisungen geeignet. -
executeUpdateDelete()
: Erst ab Android 2.2 verfügbar und fürUPDATE
undDELETE
Anweisungen geeignet. -
simpleQueryForLong()
: liefert einen Integer in einer 1 x 1 Tabelle als Ergebnis. Gut fürSELECT count(*) FROM table
geeignet. -
simpleQueryForString()
: Arbeitet genauso wiesimpleQueryForLong
, liefert aber statt Integer einen Strings-Wert zurück.
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.
Die Dokumentation unterliegen der CC-BY-NC 4.0 Lizenz.
Der Quellcode unterliegt der CC0 1.0 Universell Lizenz.