E
enrem
Erfahrenes Mitglied
- 29
Ich habe dir ein Beispiel gemacht. Die Zip einfach importieren.
Hier der ganze Code:
Uebungen.java
UebungenList.java
RMDatabase.java
main.xml
uebungen_list.xml
AndroidManifest.xml
RMDatabase ist eine Hilfsklasse. Damit lege ich die Tabelle AlleUebungen an. Deine Datenbank existiert ja bereits. Kannst also darauf verzichten. Dort steht mehr drin als du benötigst. Diese verwende ich beispielsweise um im Nachhinein die Datenbank trotz enthaltener Daten anzupassen.
Ich hoffe es hilft dir...
Gruß enrem
Hier der ganze Code:
Uebungen.java
Code:
public class Uebungen extends Activity {
// Mit dieser Datenbank arbeiten alle Activitys.
public static final String SQL_DATABASE = "Uebungen.db";
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("MyApp", "-- ON CREATE --");
setContentView(R.layout.main);
Button btnList = (Button) findViewById(R.id.List);
btnList.setOnTouchListener(onTouchButton);
TextView myMessage = (TextView) findViewById(R.id.message);
myMessage.setText("Beispiel Uebungen");
}
OnTouchListener onTouchButton = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.List:
if( event.getAction() == MotionEvent.ACTION_UP){
Intent intent = new Intent(getApplicationContext(), UebungenList.class);
startActivityForResult(intent, 1);
}
break;
}
return false;
}
};
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
Toast.makeText(getApplicationContext(), "Die ListView wurde aufgerufen", Toast.LENGTH_LONG).show();
break;
}
}
}
Code:
public class UebungenList extends ListActivity {
private RMDatabase mDB = null;
// Adapter für die ListView
private SimpleCursorAdapter mAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("MyApp", "+-- ON CREATE --+ DictionaryList");
// Objekt der RMDatabase erzeugen
mDB = new RMDatabase();
// Datenbank öffnen. Geht was schief, dann raus!
if(!mDB.open(Uebungen.SQL_DATABASE)){
finish();
return;
}
// Den Inhalt der ListView erzeugen. Angezeigt dir das Attribut Auswahl.
// Hier werden mehrere Attribute mit Pipes angehangen.
// Es ginge auch : "SELECT Source AS Auswahl FROM DICTIONARY"
initListView("SELECT _id, Uebungen || ' / ' || Muskel AS Auswahl FROM AlleUebungen");
}
public void onDestroy() {
super.onDestroy();
Log.e("MyApp", "-- ON DESTROY -- DictionaryList");
// Datenbank schließen.
mDB.close();
}
private void initListView(String sql){
// Abfrage erstellen. In cur ist das Ergebnis der Abfrage.
Cursor cur = mDB.getDatabase().rawQuery(sql, null);
if (cur != null) {
// Einen Adapter ertellen und der ListView zuweisen..
startManagingCursor(cur);
mAdapter = new SimpleCursorAdapter(this, R.layout.uebungen_list, cur,
new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
setListAdapter(mAdapter);
}
}
}
Code:
public class RMDatabase{
/** The m database. */
private SQLiteDatabase mDatabase = null;
/** The m error message. */
private String mErrorMessage = "";
/** The m new version. */
private boolean mNewVersion = false;
/**
* Open database on sd card.
*
* @param databaseName the database name
* @return true, if successful
*/
public boolean openDatabaseOnSDCard(String databaseName){
// Datenbank erzeugen und öffnen
if (! openOrCreateDatabaseOnSDCard(databaseName)){
mErrorMessage = "Fehler beim öffnen der Datenbank!";
return false;
}
return true;
}
/**
* Open or create database on sd card.
*
* @param dbName the db name
* @return true, if successful
*/
public boolean openOrCreateDatabaseOnSDCard(String dbName) {
boolean success = false;
try {
// Datenbank auf SD-Karte erzeugen anschl. öffnen
String path = "/sdcard/"+dbName;
mDatabase = SQLiteDatabase.openOrCreateDatabase(path, null);
// Datenbank angelegt und erfolgreich geöffnet.
success = true;
}
catch (SQLiteException ex) {
// Error
Log.e("MyApp", "error -- " + ex.getMessage(), ex);
}
return success;
}
/**
* Checks if is open.
*
* @return true, if is open
*/
public boolean isOpen(){
return mDatabase.isOpen();
}
/**
* Open.
*
* @return true, if successful
*/
public boolean open(String database){
// Datenbank öffnen
openDatabaseOnSDCard(database);
// Wenn sich die Versionsnummer ändert, werden
// Tabellen erzeugt und Strukturen angepasst.
// 0 = Es wird immer angepasst...
setVersion(1);
// Wenn nicht erfolgreich geöffnet dann raus
if(!isOpen()){
return false;
}
// Bei einer neuen Version wird hier die Datenbank angepasst.
validateDatabase();
return true;
}
/**
* Close.
*/
public void close(){
if(mDatabase != null){
mDatabase.close();
}
}
/**
* Gets the database.
*
* @return the database
*/
public SQLiteDatabase getDatabase(){
return mDatabase;
}
/**
* Gets the error message.
*
* @return the error message
*/
public String getErrorMessage(){
return mErrorMessage;
}
/**
* Sets the version.
*
* @param version the new version
*/
public void setVersion(int version){
if(version != mDatabase.getVersion() ){
mNewVersion = true;
}else{
if(version == 0) mNewVersion = true;
}
mDatabase.setVersion(version);
}
/**
* Gets the version.
*
* @return the version
*/
public int getVersion(){
return mDatabase.getVersion();
}
/**
* Validate database.
*
* @return true, if successful
*/
public boolean validateDatabase() {
if(! mNewVersion) return true;
Log.d("MyApp", "Datenbank Verion "+getVersion()+" wird aktualisiert...");
// // Nurm zum testen....
// if (execute("DROP TABLE 'DICTIONARY'")){
// Log.d("MyApp","DICT.. gelöscht....");
// }
// Erzeuge Tabellen wenn sie nich existieren
createTableStructure();
// Erzeugt einen Trigger für das Feld MyDateTime. Dort wird bei jeder
// Neuanlage das aktuelle Datum und die aktuelle Zeit eingetragen.
createTrigger();
// Die Struktur einer laufenden Datenbank erweitern.
// Es gehen keine Daten verloren.
changeTableStructure();
// Ein paar Datensätze hinzufügen
addRecord();
return true;
}
/**
* Creates the table structure.
*
* Geht nur, wenn die Tabelle nicht exisitert. Sonst ist
* changeTableStructure() für Erweiterungen zuständig.
*
* @return true, if successful
*/
private boolean createTableStructure() {
boolean success = false;
try {
// INTEGER PRIMARY KEY AUTOINCREMENT
// Der Primärschlüssel hier mit einem Autowert kann nur beim
// erstellen der Tabelle angelegt werden. Nachträglich
// geht das nicht. Jede Tabelle hat einen INTEGER PRIMARY KEY,
// dieser ist als ROWID, OID oder ROWID erreichbar. Definiert
// man diese Spalte selber (evtl. mit AUTOINCREMENT), dann wird
// diese Spalte verwendet, ansonsten wird eine intern erzeugt
// es ist die ID im B-Tree).
// UNIQUE
// Doppelte Einträge sind mit UNIQUE nicht möglich.
// Nachträglich siehe changeTableStructure konnte ich mit ALTER TABLE
// solch ein Feld nicht anlegen. In diesem Fall geht es mit einem
// selbst erzeugten Index. Siehe ebenfalls changeTableStructure.
// NOT NULL
// Es wir ein Wert erwartet. Nullwerte sind nicht erlaubt.
// Datentypen!!!
// Die in Klammern angegebenen Begrenzungen bsp. VARCHAR(10) werden
// in SQLite 3 nicht berücksichtigt. Hier die wichtigsten....
// Mehr unter http://www.sqlite.org/datatype3.html
// Tabelle1 ertsellen. Leerschritt hinter Tabelle1 ist wichtig.
String sql = "CREATE TABLE IF NOT EXISTS AlleUebungen ";
// Feldnamen ebenfalls anlegen.
// Diese werden in runden Klammern umfasst.
sql = sql + "(";
// Der Primärschlüssel hier mit einem Autowert kann nur beim
// erstellen der Tabelle angelegt werden. Nachträglich
// geht das nicht. Es ist jedoch möglich in solch einem Falls
// auf das Feld ROWID oder OID zurück zu greifen.
sql = sql + "_id INTEGER PRIMARY KEY AUTOINCREMENT, ";
// TEXT
// Folgende Werte können verwendet werden: NULL, TEXT, BLOB
sql = sql + "Uebungen TEXT, ";
sql = sql + "Muskel TEXT ";
// Klammer zum schließen nicht vergessen
sql = sql + ")";
// Syntax im Debugger (LogCat) ausgeben
Log.d("MyApp","sql : "+sql);
// SQL-Anweisung ausführen
mDatabase.execSQL(sql);
// Wenn kein Fehler alles OK!
success = true;
}
catch (SQLiteException ex) {
Log.e("MyApp", "error createTableStructure -- " + ex.getMessage(), ex);
// error means tables does not exits
}
return success;
}
/**
* Change table structure.
*
* @return true, if successful
*/
private boolean changeTableStructure() {
// // Spalte nachträglich hinzufügen
// if(execute("ALTER TABLE Tabelle1 ADD COLUMN New_Column1 TEXT DEFAULT 'Ihre Eingabe'")){
// Log.d("MyApp", "ERFOLGREICH ALTER TABLE 1");
// }
//
// if(execute("ALTER TABLE Tabelle1 ADD COLUMN New_Column2 TEXT DEFAULT 'Ihre Eingabe'")){
// Log.d("MyApp", "ERFOLGREICH ALTER TABLE 2");
// }
//
// // Zwei weitere Felder (Index ist notwendig) werden als einzigartig hinzugefügt.
// // Besonders ist, das bei der indizierung die Einzigartigkeit aus beiden
// // Feldern besteht.
// execute("ALTER TABLE Tabelle1 ADD COLUMN New_Unique1");
// execute("ALTER TABLE Tabelle1 ADD COLUMN New_Unique2");
//
// // Einen Index von Tabelle1 der Felder New_Unique1 + New_Unique2 erzeugen.
// execute("CREATE UNIQUE INDEX Tabelle1_Index1 ON Tabelle1(New_Unique1, New_Unique2)");
return true;
}
/**
* Creates the trigger.
*
* @return true, if successful
*/
private boolean createTrigger() {
// Mit diesem Trigger ist es möglich dem Feld MyDateTime das aktuelle Datum und die
// aktuelle Uhrzeit bei jeder Neuanlage mitzugeben. Beim erstellen der Tabelle
// über DEFAULT geht das leider nicht.
// String trigger = "CREATE TRIGGER insert_Tabelle1_DateTime AFTER INSERT ON Tabelle1 "+
// " BEGIN UPDATE Tabelle1 SET MyDateTime = DATETIME('NOW') WHERE rowid = new.rowid; END; ";
//
// if (!execute(trigger)){
// Log.d("MyApp","Trigger für MyDateTime nicht erstellt");
// }else{
// Log.d("MyApp","Trigger für MyDateTime erfolgreich erstellt");
// }
return true;
}
/**
* Execute.
*
* @param sql the sql
* @return true, if successful
*/
public boolean execute(String sql) {
boolean success = false;
try {
mDatabase.execSQL(sql);
success = true;
}
catch (SQLiteException ex) {
// Error
Log.e("MyApp", "error execute -- " + ex.getMessage(), ex);
}
return success;
}
/**
* Adds the record.
*
* @return true, if successful
*/
private void addRecord() {
ContentValues values = new ContentValues();
values.put("Uebungen", "Kniebeugen");
values.put("Muskel", "Oberschenkel");
mDatabase.insert("AlleUebungen", null, values);
values.put("Uebungen", "Kniebeugen2");
values.put("Muskel", "Oberschenkel2");
mDatabase.insert("AlleUebungen", null, values);
}
}
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="fill_parent"
android:id="@+id/main" android:layout_width="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/message"/>
<Button android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/List" android:text="List"></Button>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/Info" android:text="Info"></TextView>
</LinearLayout>
Code:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:id="@+id/LinearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:paddingLeft="5dip" android:layout_width="fill_parent" android:singleLine="false" android:id="@android:id/text1"/>
</LinearLayout>
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.christophe.uebungen"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission-group android:name="android.permission-group.STORAGE"></permission-group>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Uebungen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".UebungenList"
android:label="UebungenList"
android:configChanges="orientation|keyboardHidden">
</activity>
</application>
<uses-sdk android:minSdkVersion="6" />
</manifest>
Ich hoffe es hilft dir...
Gruß enrem
Anhänge
Zuletzt bearbeitet: