Was ist SQLite?
SQLite ist ein Datenbanksystem, welches ohne einen Server auskommt. Im Gegensatz zu MySQL benötigt SQLite keine weitere Konfiguration. Daher wird SQLite in mobilen Geräten gerne verwendet. Das Datenbanksystem läuft als Dienst im Hintergrund und kann auf eine Datenbank (*.db-Datei) einer App zugreifen.
Auf eine SQLite-Datenbank zugreifen
Zuerst muss das Paket android.databse.sqlite.SQLiteDatabase in die zugehörige Datei importiert werden. Mit der Methode openOrCreateDatabase() kann eine Verbindung zur Datenbank hergestellt werden. Erstellen Sie eine neue Android-Applikation mit dem Namen “TestingAndroidDatabase” und wählen Sie anschließend das zugehörige API-Level. Erweitern Sie Ihre gerade erstelle Klasse “TestingAndroidDatabase” mit folgenden Befehlen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.test.TestingAndroidDatabase; import android.app.Activity; import android.os.Bundle; import android.database.sqlite.SQLiteDatabase; public class TestingAndroidDatabase extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SQLiteDatabase db; db = openOrCreateDatabase( "TestingData.db" , SQLiteDatabase.CREATE_IF_NECESSARY , null ); } } |
Zuerst müssen wir die Basisklasse SQLiteDatabase definieren. Anschließend übergeben wir der Methode openOrCreateDatabase() einige Parameter. Der Erste Parameter beschreibt den Namen der SQLite-Datenbank. Der zweite Parameter prüft, ob die Erstellung der Datenbank notwendig ist bzw. ob diese schon besteht. Der letzte Parameter beschreibt die Fehlerbehandlung. In diesem Fall ist die Fehlerbehandlung null.
Nachdem der Code etwas erweitert wurde und jetzt nach dem Ausführen des Codes eine Datenbankdatei erstellt wird, können wir fortfahren.
[notice]Wo speichert Android die Datenbank?
Android speichert die SQLite-Datenbank auf einer separaten Partition, welche Lese -und Schreibrechte besitzt. Mit der ADB-Shell können Sie schnell eine Verbindung zu dieser Partition herstellen.
Unter /data/data/[Paketname der Anwendung]/databases finden Sie Ihre zuvor erstellte Datenbank.[/notice]
Tabellen in der SQLite-Datenbank erstellen
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package com.test.TestingAndroidDatabase; import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.database.sqlite.SQLiteDatabase; public class TestingData extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SQLiteDatabase db; db = openOrCreateDatabase( "TestingData.db" , SQLiteDatabase.CREATE_IF_NECESSARY , null ); db.setVersion(1); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true); final String CREATE_TABLE_COUNTRIES = "CREATE TABLE tbl_countries (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "country_name TEXT);"; final String CREATE_TABLE_STATES = "CREATE TABLE tbl_states (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "state_name TEXT," + "country_id INTEGER NOT NULL CONSTRAINT " + "contry_id REFERENCES tbl_contries(id) " + "ON DELETE CASCADE);"; db.execSQL(CREATE_TABLE_COUNTRIES); db.execSQL(CREATE_TABLE_STATES); final String CREATE_TRIGGER_STATES = "CREATE TRIGGER fk_insert_state BEFORE " + "INSERT on tbl_states" + "FOR EACH ROW " + "BEGIN " + "SELECT RAISE(ROLLBACK, 'insert on table " + ""tbl_states" voilates foreign key constraint " + ""fk_insert_state"') WHERE (SELECT id FROM " + "tbl_countries WHERE id = NEW.country_id) IS NULL; " + "END;"; db.execSQL(CREATE_TRIGGER_STATES); } } |
Wie bereits zuvor im Code verdeutlicht, erstellen / öffnen wir eine Datenbank mit der Methode openOrCreateDatabase(). Mit setVersion() wird die Datenbank-Version gesetzt. Die Methode setLocale() gibt an, in welchem Encoding die Zeichen in den einzelnen Tabellen abgespeichert werden. Im weiteren Verlauf erstellen wir hier die Tabellen. In der letzten Tabelle erstellen wir eine Tabelle mit einem Fremdschlüssel.
Inhalte in die Tabellen hinzufügen
Android bietet eine unzählige Menge an verschiedenen Klassen, die die SQLite-Datenbank Zugriffe erleichtern. Mit der Klasse ContentValues können Tabelleninhalte hinzugefügt oder verändert werden.
|
1 2 3 4 5 6 7 8 9 10 11 |
ContentValues values = new ContentValues(); values.put("country_name", "US"); long countryId = db.insert("tbl_countries", null, values); ContentValues stateValues = new ContentValues(); stateValues.put("state_name", "Texas"); stateValues.put("country_id", Long.toString(countryId)); try { db.insertOrThrow("tbl_states", null, stateValues); } catch (Exception e) { //catch code } |
Update der Inhalte einer Tabelle
Wieder die gleiche Klassse, nur zur Verwendung um einen “Record” in der Datenbank abzuändern. Mit der Variable der Klasse updateCountry bereiten wir alles vor. Danach hängen wir die Methode put an die Variable der Klasse heran und füllen diese dann mit zwei Argumenten. Das Erste Argument zeigt auf, auf welche Spalte in der Tabelle zugegriffen werden soll. Das nächste Argument beschreibt das Feld, welches geändert werden soll.
|
1 2 3 |
ContentValues updateCountry = new ContentValues(); updateCountry.put("country_name", "United States"); db.update("tbl_countries", updateCountry, "id=?", new String[] {Long.toString(countryId)}); |
Einträge der Tabelle löschen
Ganz zu Anfang haben wir eine Variable der Klasse gebildet, welche vom Objekt SQLiteDatabase abstammt. Der Variablenname db hilft uns dabei, weitere Methoden auszuführen. Im folgenden ein Beispiel zur Löschung einer Tabelle.
|
1 |
db.delete("tbl_states", "id=?", new String[] {Long.toString(countryId)}); |
Toller Bericht aber wo ist Teil 2
Danke für diese nette Einführung in die SQLite programmierung bei Android.
Im Internet hat sich überall die SqliteHelper Klasse finden lassen, ich möchte mich Schrittweise damit beschäftigen. Dieser Blog hat mir den Tag gerettet
Vielen Dank!
Hallo
Ich plane eine App zu entwickeln, welche ca. 6000 Datensätze enthält.
Die Liste existiert zum aktuellen Zeitpunkt nur als Excelfile. Da die Daten “offline” zur Verfügung stehen soll ohne eine Internetverbindung,habe ich mir gedacht diese in einer App als SQLight-Daten zu integrieren.
Meine Frage:
Besteht die Möglichkeit diese Daten automatisch in eclipse importieren?
Danke im Voraus für dein Feedback.
Gruss
enkurc
Hallo, vielen Dank für Ihre Nachricht.
Sie könnten die Datensätze in CSV exportieren. Sofern dies geschehen ist, könnten Sie einen Parser bauen, der die CSV-Datei ausliest und die Daten dann sukzessive in die SQLite-Datenbank schreibt. Dies ist eigentlich kein großer Aufwand.
Sofern Sie Unterstützung bei Ihrem Projekt benötigen, kann ich Ihnen gerne behilflich sein. Im Impressum steht meine E-Mail Adresse. Sie können mich jederzeit kontaktieren.
Mit besten Grüßen
Martin Kogut