Hallo, Shared SQLite DB
Nachdem ich nun die fundamentalen Dinge über die Android-Entwicklung gelesen habe, mache ich mir jetzt die Hände schmutzig. Ich habe die ersten Beispiele und Tutorials aus den einschlägigen Quellen, nämlich developer.android.com, Hello, Android von Ed Burnette und Professional Android Development von Reto Meier ausprobiert, und komme zu dem Ergebnis, dass ich meine Hände auch schmutzig lassen kann. Schließlich geht es hier um Best Practices und die Beispiele haben vorbildlichen Character.
Wie man schon am Hello World-Tutorial erkennen kann, trennt man das Layout seiner Oberfläche am Besten in Form von XML vom Inhalt ab. Ähnlich geht man in der Webentwicklung vor, wo man HTML von CSS trennt. In der Android-Entwicklung hat das den Vorteil, dass man verschiedene Layouts für verschiedene Bildschirme und Geräte entwickeln kann und dabei vom Android SDK auch unterstützt wird.
Auch der Lokalisierung wird von Anfang an Rechnung getragen, indem Textstrings der Oberfläche nur per ID aus dem Layout referenziert werden. Für jede Sprache stellt Google eine Dateierweiterung bereit, so dass die Textstrings aus der richtigen Datei eingelesen werden.
Nun stelle ich mir die Frage, wie ich Daten zwischen Activities teilen kann. Mein erster Gedanke war, die Daten in Form einer XML-Datei zu speichern und für die Anwendung in eine Objektstruktur einzulesen, so dass eine schneller Zugriff möglich ist. Ein bevorzugter Weg, Persistenz in Android zu ermöglichen, ist aber die Verwendung einer SQLite-Datenbank. Auf reigndesign habe ich einen Weg gefunden eine Datenbank von außen beizusteuern. Statt die DB von innen über das Android-SDK anlegen zu müssen, kann ich die Datenbank in das assets-Verzeichnis des Projekts legen.
Ich realisiere meinen von SQLiteOpenHelper abgeleiteten DBHelper als Singleton. Auch wenn es nichts kosten mag, in jeder Activity einen DBHelper zu initialisieren, muss ich mit einem Singleton nicht einmal über die Kosten von Objekterzeugungen nachdenken, denn ein paar Zeilen Code für die Erstellung eines Singleton kosten schon gar nichts. Ich spare mir auch die Mühe, in jeder Activity an jeder in Frage kommenden Stelle des Activity-Lebenszyklus die Datenbank öffnen und schließen zu müssen. Stattdessen stelle ich in meiner abgeleiteten Application-Klasse MyApplication eine Referenz auf eine DBHelper-Instanz bereit, über die ich von jeder Activity aus auf die Datenbank zugreifen kann.
Der Zugriff aus der Activity sieht dann für einen schreibenden Zugriff etwa so aus:
package org.example.hellosqlite;
import static android.provider.BaseColumns._ID;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;
public class HelloSQLite extends Activity
{
private static final String TITLE = "title";
public static final String TABLE_NAME = "books";
private static String[] FROM = { _ID, TITLE, };
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
addBook("Hello, Android! 3e");
}
private DataBaseHelper DBH()
{
MyApplication application = ((MyApplication)getApplicationContext());
return application.GetDataBaseHelper();
}
private void addBook(String string)
{
SQLiteDatabase sqlitedb = DBH().getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TITLE, string);
sqlitedb.insertOrThrow(TABLE_NAME, null, values);
}
}



