
Wer mit Android Daten in Datenbanken speichern will, kommt an SQLite nicht wirklich vorbei. Das abgespeckte DBMS unterstützt alles, was man für Apps auf einem Smartphone brauchen könnte. Wer mit ein paar Zeilen Code auf eine Datenbank zugreifen möchte, benutzt am besten eine Klasse die von SQLiteOpenHelper() abgeleitet wird.
public class myDatabase extends SQLiteOpenHelper { private static final String DB_NAME = "database.db"; private static final int DB_VERSION = 1; public MyDatabase(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE tbl_test ( id INTEGER PRIMARY KEY AUTOINCREMENT, test TEXT NOT NULL )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS tbl_test"); onCreate(db); } }
Diese Klasse stellt nicht nur die "Schnittstelle" zur Datenbank dar, sie erzeugt und updatet bei Bedarf auch die Tabellen. Erhöht man beispielsweise den Wert von DB_VERSION, so wird automatisch onUpdate() ausgeführt, was die Tabellen entsprechend neu erzeugt - Bei gefüllten Datenbanken sollte man hier allerdings besser mit ALTER TABLE statt DROP TABLE arbeiten ;)
Queries können mittels execSQL() oder rawQuery() durchgeführt werden. Wer es (in meinen Augen) umständlich mag, kann für jede Query entsprechende Objekte (query, insert, update, delete) erstellen, die dann an die Datenbank übergeben werden. Ich finde das umständlich, da derartige Queries erstens nicht gerade übersichtlich sind und somit nicht zur guten Lesbarkeit des Codes beitragen und zweitens weil das Erzeugen und Hin- und Herschaufeln von Objekten, die letztendlich nur einen String repräsentieren in meinen Augen unnützer Overhead sind. Aber jedem das Seine...
myDatabase db = new myDatabase(getApplicationContext()); sql = "INSERT INTO tbl_test (test) VALUES ('xyz')"; db.getWritableDatabase().execSQL(sql); String sql = "SELECT id FROM tbl_test"; Cursor result = db.getWritableDatabase().rawQuery(sql, null); int value; while(result.moveToNext()) { value = result.getInt(0); }
Mit moveToFirst() und moveToNext() (usw.) iteriert ihr durch die Zeilen, die von der Anfrage zurückgegeben wurden.
Lessons learned the hard way...
SQL Anfragen basteln ist fehleranfällig. Wer kennt das nicht. Hier mal ein Tippfehler, dort ein Komma vergessen... Das Problem ist, dass Android nicht wie PHP mit einem Fehler reagiert, sondern sich die Anwendung mit einer nichtssagenden Fehlermeldung ins digitale Nirvana verabschiedet. Hier können einfache try-catch-Konstrukte jedoch viel Frust vermeiden:
try { sql = "SELECT id FROM nonexisting_table LIMIT 1"; Cursor result = db.getWritableDatabase().rawQuery(sql, null); } catch (Exception e) { TextView tv = (TextView) findViewById(R.id.myText); tv.setText("ERROR: " + e.getMessage().toString() + " \n SQL: " + sql); }