In diesem Tutorial demonstriere ich den Umgang mit der SQLite Datenbank, insbesondere das Erstellen der Datenbank und der Datenbanktabellen wenn diese noch nicht vorhanden sind, das auslesen von Daten, das einfügen neuer und ändern schon vorhandener Daten.
Als erstes legen wir einmal ein paar Variablen an um den Zugriff auf die Datenbank zu erleichtern.
MY_DB_NAME enthält unseren Datenbanknamen und
MY_DB_TABLE den Namen unserer Tabelle.
Bei mehreren Tabellen müssen wir das entsprechend anpassen.
Im onCreate unserer ersten activity rufen wir die Function "onCreateDBAndDBTabled" auf, die überprüft ob die Datenbank existiert.
Sollte die Datenbank noch nicht existieren, wird diese angelegt,
anschließend werden die benötigten Datenbanktabellen erzeugt.
final static String MY_DB_NAME = "TankPro2";
final static String MY_DB_TABLE = "fahrzeuge";
final static String tag="ensacom";
@Override
/** Wird aufgerufen wenn die Activity das erste mal aufgerufen wird. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onCreateDBAndDBTabled();
setContentView(R.layout.main);
}
/** Datenbank und Tabellen erstellen wenn noch nicht vorhanden */
private void onCreateDBAndDBTabled()
{
SQLiteDatabase myDB = null;
try {
myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
myDB.execSQL("CREATE TABLE IF NOT EXISTS " + MY_DB_TABLE
+ " (_id integer primary key autoincrement,
name varchar(100),
model varchar(100),
bemerkungen varchar(255),
kraftstoffart integer(3),
tankinhalt integer(3))"
+";");
} finally {
if (myDB != null)
myDB.close();
}
}
Alles anzeigen
Neuen Datensatz einfügen
Um nun einen neuen Datensatz in unserer Datenbanktabelle anzulegen,
öffnen wir die Datenbank, schreiben unsere Daten in diese und schließen sie anschließend wieder.
Die Daten die ich in die Datenbank einfügen will, kommen in diesem Beispiel aus verschiedenen Komponenten.
Wir erinnern uns, wir haben folgende Spalten in unserer Datenbank.
name, model, bemerkungen, kraftstoffart und tankinhalt.
name, model, bemerkungen und tankinhalt sind vom Typ varchar.
Diese Werte holen wir aus EditText-Komponenten.
die Spalte kraftstoffart ist vom Typ integer. den Wert für die neue Kraftstoffart holen wir in diesem Bsp. aus einer Spinner-Komponente.
EditText KfzName = (EditText)findViewById(R.id.ed_KfzName);
EditText KfzModel = (EditText)findViewById(R.id.ed_KfzModel);
EditText KfzBemerkungen = (EditText)findViewById(R.id.ed_KfzBemerkung);
Spinner KfzKraftstoffart = (Spinner)findViewById(R.id.cb_KfzTreibstoffArt);
EditText KfzTankinhalt = (EditText)findViewById(R.id.ed_KfzTankinhalt);
int i = KfzKraftstoffart.getSelectedItemPosition();
myDB.execSQL("INSERT INTO "+MY_DB_TABLE+" (name, model, bemerkungen, kraftstoffart, tankinhalt) "
+"VALUES ('"+KfzName.getText().toString()+"',"+
"'"+KfzModel.getText().toString()+"',"+
"'"+KfzBemerkungen.getText().toString()+"',"+
"'"+i+"',"+
"'"+KfzTankinhalt.getText().toString()+
"');");
Log.v(tag, "Insert new KFZ: " + KfzName.getText().toString() + ", " + KfzModel.getText().toString());
Alles anzeigen
Vorhandenen Datensatz updaten
Natürlich wollen wir einen Datensatz später auch bearbeiten.
Um nun einen bestimmten Datensatz bearbeiten zu können, müssen wir dessen ID übergeben um diese in der Datenbankabfrage verwenden zu können.
Folgende Zeile fragt ab ob eine Variable mit dem Namen id an unsere activity übergeben wurde.
Sollte die Variable übergeben worden sein, kann man diese für seine Abfrage verwenden.
if(getIntent().hasExtra("id") == true)
{
long l = getIntent().getExtras().getLong("id");
myDB.execSQL("UPDATE "+MY_DB_TABLE+" SET "+
"name = '"+KfzName.getText().toString()+"', "+
"model = '"+KfzModel.getText().toString()+"', "+
"bemerkungen ='"+KfzBemerkungen.getText().toString()+"', "+
"kraftstoffart ='"+i+"', "+
"tankinhalt = '"+KfzTankinhalt.getText().toString()+"' "+
"WHERE _id = "+l+";");
Log.v(tag, "KFZ: " + KfzName.getText().toString() + ", " + KfzModel.getText().toString() + " updatet");
}
Alles anzeigen
Bestimmte Spalten aus der Datenbank auslesen und in einer Liste ausgeben
Nun wollen wir den Namen und das Model aller in der Datenbank vorhandenen Fahrzeuge in einer ListView ausgeben.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase myDB = null;
try{
myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
Cursor c = myDB.rawQuery("SELECT _id, name || ', ' || model as bezeichnung,
tankinhalt FROM " +
MY_DB_TABLE, null);
startManagingCursor(c);
getListView().setOnCreateContextMenuListener(this);
final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.fahrzeuge,
c,
new String[] { "_id" },
new int[] { R.id.KfzNameModel });
adapter.setViewBinder(new ViewBinder()
{
@Override
public boolean setViewValue(View view, Cursor theCursor, int column)
{
final String ColNameModel = theCursor.getString(1); //Name und Model
((TextView)view).setText(ColNameModel);
return true;
}
});
this.setListAdapter(adapter);
}finally {
if (myDB != null)
myDB.close();
}
}
Alles anzeigen
Hier die xml-Datei für das Layout
Wie sie eine Variable von einer activity an eine andere activity übergeben oder
wie Sie die ID eines Datensatzes über den gewählten Eintrag in der ListView an ein ContextMenü übergben,
um diese weiter zu verwenden, entnehmen Sie bitte den extra für diese Themen verfassten Tutorials.
Auslesen von Daten in eine Spinner-Komponente (ComboBox)
Hier noch ein kleines Beispiel wie Sie die Fahrzeugnamen aus der Datenbank
in eine Spinner-Komponente auslesen können.
public void LoadFahrzeugSpinner(){
try {
myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
Cursor myCursor = myDB.rawQuery("SELECT _id, name, model FROM " +
MY_DB_TABLE + ";", null);
startManagingCursor(myCursor);
Spinner kfzSpinner = (Spinner)findViewById(R.id.cbFahrzeuge);
myCursor.moveToFirst();
SimpleCursorAdapter spinadapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_spinner_item,
myCursor,
new String[] { "name" },
new int[] {android.R.id.text1});
spinadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
kfzSpinner.setAdapter(spinadapter);
kfzSpinner.setPrompt(this.getResources().getString(R.string.TankenAuswahl));
kfzSpinner.setAdapter(spinadapter);
} finally {
if (myDB != null)
myDB.close();
}
}
Alles anzeigen
Um diese Abfrage nutzen zu können, muss in der xml-Datei eine Spinner-Komponente
mit der ID "cbFahrzeuge" vorhanden sein.
Ich hoffe dass ich euch den Einstieg in den Umgang mit der SQLite-Datenbank
durch mein Tutorial etwas erleichtern konnte.
Sollten doch noch Fragen aufkommen, dann schickt mir einfach eine PM oder
noch besser, stellt diese im Forum.