Inhalt des Tutorials ist das Erstellen einer SQLite-Datenbank, das Anlegen von Tabellen, sowie das Einfügen, Ändern und Auslesen von Daten aus einer Datenbank-Tabelle.
Dieses Tutorial wird etwas aufwendiger und besteht aus 3 activitys, nämlich der main-activity, der activity "fahrzeuge" auf der die gespeicherten Fahrzeuge in einer Liste ausgegeben werden und der activity "Fahrzeug_New" wo man ein neues Fahrzeug anlegen oder ein in der vorherigen activity selektiertes Fahrzeug bearbeiten kann.
Alle Dateien die in diesem Tutorial angesprochen werden finden Sie im Anhang.
Wie man ein Android-Projekt erstellt werde ich hier nicht erläutern da dies jedem klar sein sollte.
Wir definieren also in der main-activity erst ein mal ein paar Variablen die wir im Programm öfter benutzen werden.
MyDB bietet Methoden Verwalten einer SQLite-Datenbank. Dazu gehören das Erstellen und Löschen von Datenbanken und Tabellen, sowie das Ausführen von SQLAnweisungen.
MY_DB_NAME ist der Name der Datenbank.
MY_DB_TABLE ist die Tabelle die wir erzeugen wollen
MENU_FAHRZEUGE repräsentiert die ID für unseren einzigen Menüpunkt über den wir zur nächsten activity gelangen.
[size=large]Activity TankPro2[/size]
public class TankPro2 extends Activity {
SQLiteDatabase myDB = null;
final static String MY_DB_NAME = "TankPro2";
final static String MY_DB_TABLE = "fahrzeuge";
static final int MENU_FAHRZEUGE = 1;
Wir wollen, dass beim starten der Anwendung eine Verbindung zu unserer Datenbank aufgebaut wird. Dazu wird als erstes geprüft ob die Datenbank und die benötigten Tabellen überhaupt existieren. Sollte die Datenbank vorhanden sein, wird eine Verbindung zu dieser hergestellt. anderenfalls wird die Datenbank erzeugt und anschließend zu dieser verbunden. Das gleich geschieht mit unseren Datenbanktabellen. Sollte eine Tabelle nicht existieren, wird diese angelegt.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onCreateDBAndDBTabled(); //DB und Tables erstellen wenn noch nicht vorhanden
setContentView(R.layout.main);
}
Hier nun die Funktion zum erstellen der Datenbank und der Datenbanktabellen.
private void onCreateDBAndDBTabled() {
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))"
+";");
}
Alles anzeigen
Genauso können wir direkt in dieser Funktion SQL-Befehle zum löschen einer Tabelle oder zum einfügen von Daten in eine Tabelle angeben.
Nun erstellen wir noch einen Menüpunkt über den wir zur nächsten
activity „fahrzeuge“ gelangen. Dieser Menüpunkt wird nach anklicken
des Menübuttons auf unserem Handy angezeigt.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_FAHRZEUGE, 0, R.string.menuFahrzeuge)
.setShortcut('1', 'f')
.setIcon(R.drawable.menu_fahrzeuge);
return true;
}
Alles anzeigen
Nun müssen wir unseren Menüpunkt noch mit einer Aktion versehen.
Es wird geprüft ob der Menüpunkt „MENU_FAHRZEUGE“ angeklickt wurde, anschließend wird die activity „fahrzeuge“ geladen und angezeigt.
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case MENU_FAHRZEUGE:
Intent iFahrzeuge = new Intent(this, fahrzeuge.class);
startActivity(iFahrzeuge);
return true;
}
return false;
}
[size=large]Activity fahrzeuge[/size]
Nun befinden wir uns auf der activity „fahrzeuge“ wo wir den Namen und das Model aller in der Datenbank gespeicherten Fahrzeuge in einer Liste ausgeben lassen.
Außerdem wird es wieder einen Menüpunkt geben über den wir ein neues Fahrzeug anlegen können. Um die Daten eines Fahrzeuges zu bearbeiten klickt man in der Liste einfach auf den entsprechenden Eintrag, worauf die activity „Fahrzeug_New“ wie auch beim anklicken des Menüpunktes „Neues Fahrzeug“ gestartet und angezeigt wird nur das in diesem Fall die ID des Fahrzeuges mit übergeben wird.
Wir connecten zu unserer Datenbank und lesen anschließend die _id, den Namen und das Model aller Fahrzeuge aus. Die Daten werden im SimpleCursorAdapter hinterlegt den wir anschließend mit unserer Liste verbinden.
public class fahrzeuge extends ListActivity {
SQLiteDatabase myDB = null;
static final int MENU_NEW_KFZ = 0;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
myDB = this.openOrCreateDatabase(TankPro2.MY_DB_NAME, MODE_PRIVATE, null);
Cursor c = myDB.rawQuery("SELECT _id, name, model FROM " + TankPro2.MY_DB_TABLE + ";", null);
startManagingCursor(c);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
c,
new String[] { "_id" },
new int[] { android.R.id.text1 });
adapter.setViewBinder(new ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor theCursor, int column) {
String ColumnName = theCursor.getString(1); //Name
String ColumnModel = theCursor.getString(2); //Model
((TextView)view).setText(ColumnName + ", " + ColumnModel);
return true;
}
});
this.setListAdapter(adapter);
}
Alles anzeigen
Nun legen wir die Funktion „onListItemClick“ an die aufgerufen wird wenn wir einen Eintrag in der Liste anklicken.
Es wird die activity „Fahrzeug_New“ gestartet und ihr die _id des angeklickten Eintrages übergeben.
Das übergeben einer Variable an eine weitere activity geschieht über putExtra. PutExtra übergibt man den Namen der Variable und den zu übergebenden Wert.
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, Fahrzeug_New.class);
i.putExtra("id", id);
this.startActivity(i);
}
Jetzt erstellen wir wie in der vorhergehenden activity wieder ein Optionsmenü und hauchen ihm mit „onOptionsItemSelected“ Leben ein.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_NEW_KFZ, 0, R.string.menuNewKFZ)
.setShortcut('1', 'n')
.setIcon(android.R.drawable.ic_menu_add);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case MENU_NEW_KFZ:
Intent iFahrzeug_new = new Intent(this, Fahrzeug_New.class);
startActivity(iFahrzeug_new);
return true;
}
return false;
}
[size=large]Activity Fahrzeug_New[/size]
Diese activity ist etwas aufwendiger da wir mit ihr ein neues Fahrzeug anlegen oder aber ein zuvor auf der activity „fahrzeuge“ selektiertes Fahrzeug bearbeiten können.
Diese activity wird von der activity „fahrzeuge“ aufgerufen sobald man ein Fahrzeug aus der Liste auswählt oder man auf den Menüppunkt „Neues Fahrzeug“ klickt.
Wir haben uns gemerkt, das beim anklicken eines Fahrzeuges in der Liste, die _id des gewählten Fahrzeuges übergeben wird. Dies passiert nicht wenn man auf den Menüpunkt „Neues Fahrzeug“ klickt.
Also müssen wir als erstes überprüfen ob eine _id übergeben wurde um entscheiden zu können ob ein neues Fahrzeug angelegt oder die Daten des gewählten Fahrzeuges aus der Datenbank geladen werden sollen.
Diese Abfrage benötigen wir ein zweites mal bei der Frage ob die Daten neu in die Datenbank eingefügt (Neues Fahrzeug) oder geändert (Fahrzeug wurde in der Liste ausgewählt) werden sollen.
public class Fahrzeug_New extends Activity {
SQLiteDatabase myDB = null;
static final int MENU_INSERT_KFZ = 0;
static final int MENU_UPDATE_KFZ = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fahrzeug_new);
Spinner s1 = (Spinner) findViewById(R.id.cb_KfzTreibstoffArt);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this,
R.array.Kraftstoffarten,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
if(getIntent().hasExtra("id") == true) {
long l = getIntent().getExtras().getLong("id");
myDB = this.openOrCreateDatabase(TankPro2.MY_DB_NAME,
MODE_PRIVATE, null);
Cursor myCursor = myDB.rawQuery("SELECT name,
model,
bemerkungen,
kraftstoffart,
tankinhalt
FROM " + TankPro2.MY_DB_TABLE + "
WHERE _id = "+l+";", null);
startManagingCursor(myCursor);
int ColumnName = myCursor.getColumnIndex("name");
int ColumnModel = myCursor.getColumnIndex("model");
int ColumnBemerkung = myCursor.getColumnIndex("bemerkungen");
int ColumnKraftstoffart = myCursor.getColumnIndex("kraftstoffart");
int ColumnTankinhalt = myCursor.getColumnIndex("tankinhalt");
myCursor.moveToFirst();
if (myCursor != null) {
if (myCursor.isFirst()) {
EditText eName = (EditText)findViewById(R.id.ed_KfzName);
eName.setText(myCursor.getString(ColumnName));
EditText eModel = (EditText)findViewById(R.id.ed_KfzModel);
eModel.setText(myCursor.getString(ColumnModel));
EditText eBemerkungen = (EditText)findViewById(R.id.ed_KfzBemerkung);
eBemerkungen.setText(myCursor.getString(ColumnBemerkung));
Spinner sKraftstoffarten = (Spinner)findViewById(R.id.cb_KfzTreibstoffArt);
sKraftstoffarten.setSelection(myCursor.getInt(ColumnKraftstoffart), true);
EditText eTankinhalt = (EditText)findViewById(R.id.ed_KfzTankinhalt);
eTankinhalt.setText(myCursor.getString(ColumnTankinhalt));
}
}
}
}
Alles anzeigen
Wir erstellen das Menü und fragen erneut ab ob eine _id übergeben wurde oder nicht.
Wurde eine _id übergeben, steht auf unserem Button "Update" ansonsten "Speichern"
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
if(getIntent().hasExtra("id") == true)
{
menu.add(0, MENU_UPDATE_KFZ, 0, R.string.menuUpdate)
.setShortcut('1', 's')
.setIcon(android.R.drawable.ic_menu_save);
}
else
{
menu.add(0, MENU_INSERT_KFZ, 0, R.string.menuInsert)
.setShortcut('1', 's')
.setIcon(android.R.drawable.ic_menu_save);
}
return true;
}
Alles anzeigen
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case MENU_INSERT_KFZ:
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();
if(KfzName.length()!=0)
{
myDB = this.openOrCreateDatabase(TankPro2.MY_DB_NAME,
MODE_PRIVATE, null);
//KFZ-Daten updaten (UPDATE)
if(getIntent().hasExtra("id") == true)
{
long l = getIntent().getExtras().getLong("id");
myDB.execSQL("UPDATE "+TankPro2.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+";");
}
//Neues KFZ in Datenbank speichern (INSERT)
else
{
myDB.execSQL("INSERT INTO "+TankPro2.MY_DB_TABLE+"
(name,
model,
bemerkungen,
kraftstoffart,
tankinhalt) "
+"VALUES ('"+KfzName.getText().toString()+"',"+
"'"+KfzModel.getText().toString()+"',"+
"'"+KfzBemerkungen.getText().toString()+"',"+
"'"+i+"',"+"'"+
KfzTankinhalt.getText().toString()+"');");
}
finish();
return true;
}
else
{
Toast toast = Toast.makeText(this, "Bitte geben Sie einen Namen für das Fahrzeug ein!",
Toast.LENGTH_SHORT);
toast.show();
}
}
return false;
}
}
Alles anzeigen