Listview per klick o Spinner aktualisieren

Ich habe dir ein Beispiel gemacht. Die Zip einfach importieren.

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;

        }
    }
    
}
UebungenList.java
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);
        }

    }
    
}
RMDatabase.java
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);
    }
}
main.xml
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>
uebungen_list.xml
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>
AndroidManifest.xml
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>
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
 

Anhänge

  • Uebungen.zip
    47,5 KB · Aufrufe: 106
  • Bild1.png
    Bild1.png
    2,6 KB · Aufrufe: 192
  • Bild2.png
    Bild2.png
    3,2 KB · Aufrufe: 228
Zuletzt bearbeitet:
Also er wechselt jetzt auf die Seite wo die Listview angezeigt werden soll trotzdem wird nix angezeigt, hmm.
Hier ist mal mein Code und die Datenbank.

EigenesTraining.java
Code:
package lu.projekt.FitnessApp;


import android.app.Activity;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.View;
import android.widget.SimpleCursorAdapter;

public class EigenesTraining extends Activity {
    
    private SQLiteDatabase mDB = null; 
    
    // Adapter für die ListView
    private SimpleCursorAdapter mAdapter;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("MyApp", "+-- ON CREATE --+ DictionaryList");
        
        String path = "/sdcard/AlleUebungen.db";
        mDB = SQLiteDatabase.openOrCreateDatabase(path, null); 
  
        // 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.rawQuery(sql, null);
        
        if (cur != null) {
            // Einen Adapter ertellen und der ListView zuweisen..
            startManagingCursor(cur);
            mAdapter = new SimpleCursorAdapter(this, R.layout.listitem, cur,
                    new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
            setListAdapter(mAdapter);
        }

    }

    private void setListAdapter(SimpleCursorAdapter mAdapter2) {
        // TODO Auto-generated method stub
        
    } 
}

listitem.xml
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>

Sry wenn ich es vieleicht nicht kapiere aber ich bin ein ziemlicher Anfänger denn wir müssen für die Schule dieses Jahr ein Projekt machen und ich muss eine Android App entwickeln und ich hab erst im Oktober mit der Sprache Java angefangen, also dann auch erst mit Android. Ich freu mich aber sehr dass du dir soviel mühe gibts mir das zu erklären aber irgendwie klappt das nicht wenn ich versuche den Code auf mein Programm umzuschreiben. Hier hast du jetzt mal mein Code wo die Listview angezeigt werden soll mit der listitem.xml

MFG Chris92
 
Also er wechselt jetzt auf die Seite wo die Listview angezeigt werden soll trotzdem wird nix angezeigt, hmm.
Hier ist mal mein Code und die Datenbank.

EigenesTraining.java
Code:
package lu.projekt.FitnessApp;


import android.app.Activity;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.View;
import android.widget.SimpleCursorAdapter;

public class EigenesTraining extends Activity {
    
    private SQLiteDatabase mDB = null; 
    
    // Adapter für die ListView
    private SimpleCursorAdapter mAdapter;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("MyApp", "+-- ON CREATE --+ DictionaryList");
        
        String path = "/sdcard/AlleUebungen.db";
        mDB = SQLiteDatabase.openOrCreateDatabase(path, null); 
  
        // 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.rawQuery(sql, null);
        
        if (cur != null) {
            // Einen Adapter ertellen und der ListView zuweisen..
            startManagingCursor(cur);
            mAdapter = new SimpleCursorAdapter(this, R.layout.listitem, cur,
                    new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
            setListAdapter(mAdapter);
        }

    }

    private void setListAdapter(SimpleCursorAdapter mAdapter2) {
        // TODO Auto-generated method stub
        
    } 
}
listitem.xml
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>
Sry wenn ich es vieleicht nicht kapiere aber ich bin ein ziemlicher Anfänger denn wir müssen für die Schule dieses Jahr ein Projekt machen und ich muss eine Android App entwickeln und ich hab erst im Oktober mit der Sprache Java angefangen, also dann auch erst mit Android. Ich freu mich aber sehr dass du dir soviel mühe gibts mir das zu erklären aber irgendwie klappt das nicht wenn ich versuche den Code auf mein Programm umzuschreiben. Hier hast du jetzt mal mein Code wo die Listview angezeigt werden soll mit der listitem.xml

MFG Chris92
 

Anhänge

  • AlleUebungen.zip
    2,4 KB · Aufrufe: 97
Auf den ersten Blick würde ich sagen, das muss weg. Du überschreibst dir die Methode setListAdapter. Du könntest die auch überschreiben und eine eigene Method erzeugen. In diesem Fall brauchst du das nicht.

Entferne diesen Code mal aus der EigenesTraining.java.

Code:
private void setListAdapter(SimpleCursorAdapter mAdapter2) {
        // TODO Auto-generated method stub
        
    }

Sry wenn ich es vieleicht nicht kapiere aber ich bin ein ziemlicher Anfänger denn wir müssen für die Schule dieses Jahr ein Projekt machen...

Kein Problem wir haben alle mal angefangen. Ich bin VisualObjects Entwickler und schreibe auch erst seit ein paar Monaten Apps mit Java und Android.

Schau dir mal die Schnipsel an. Für die Einsteigerinfo bist du schon zu weit. Bei den Schnipseln wird es von oben nach unten interessanter.

Android-Schnipsel-Wiki

Du kannst jedes Beispiel problemlos importieren. Ein Video wie das geht siehst du hier.

Schnipsel:RM MainSimple ? Android-Schnipsel-Wiki

Du brauchst nicht immer ein neues Projekt wie im Video anzulegen, du kannst es auch in dein aktuelles Projekt importieren.

Wärmstens kann ich dir folgende kostenlose Literatur empfehlen.

Einsteiger ? Android-Schnipsel-Wiki

Das kostenlose Buch als PDF ist auch hilfreich.

dpunkt.verlag | E-Books

Melde dich ob du weiter gekommen bist, ggf. verwende ich mal deine Datenbank.

gruß enrem
 
Wenn ich das
private void setListAdapter(SimpleCursorAdapter mAdapter2) {
// TODO Auto-generated method stub

}
weglasse dann gibt er mir in der Zeile: setListAdapter(mAdapter);
eine Fehlermeldung.
"The method setListAdapter(SimpleCursorAdapter) is undefined for the type EigenesTraining"

MFG Chris92
 
Wenn ich das
private void setListAdapter(SimpleCursorAdapter mAdapter2) {
// TODO Auto-generated method stub

}
weglasse dann gibt er mir in der Zeile: setListAdapter(mAdapter);
eine Fehlermeldung.
"The method setListAdapter(SimpleCursorAdapter) is undefined for the type EigenesTraining"

Das liegt daran, dass deine Klasse EigenesTraining von der Klasse Activity erbt. Die besitzt keine Methode setListAdapter().

Deine Klasse muss von ListActivity erben.

Ändere folgedes:

Code:
statt:
public class EigenesTraining extends Activity {

schreibe 

public class EigenesTraining extends ListActivity {

Gruß enrem
 
Ok danke lag daran ich bekomme jetzt den Inhalt angezeigt.
Aber ne andere frage kann ich jetzt auf der Activity keine Spinner setzen? weil dieser wird mir nicht angezeigt und ich will die Liste ja mit einem Spinner begrenzen z.B: dass nur bei Auswahl vom Spinner = Bizeps nur die Bizeps übungen in der Listview angezeigt werden.


MFG Chris92
 
Ich würde dir vorschlagen ein neues Activity mit einem Spinner zu erzeugen. Wenn du diese Activity mit der
Code:
startActivityForResult(intent, 1);
aufrufst kannst du in der Methode onActivityResult auf das schließen reagieren.

Importiere dir mal das Beispiel aus der Anlage. Dort könntest du beispielsweise das Fenster seekEdit für deine Zwecke missbrauchen.

Schnipsel:RM Dictionary ? Android-Schnipsel-Wiki


gruß enrem
 

Anhänge

  • RM_Dictionary.zip
    74,6 KB · Aufrufe: 87
Zuletzt bearbeitet:
Das heißt man kann nicht direkt einen Spinner auf der Activity anzeigen? Man muss wie in dem Beispiel z.B: einen längeren Click auf ein Item machen wo dann das entsprechende aufgerufen wird.

Ich wollte es eigentlich so machen: siehe Anhang.

Wie es in dem Bild gezeigt wird funktioniert das nicht?

MFG Chris92
 

Anhänge

  • listview.png
    listview.png
    7,1 KB · Aufrufe: 191
Nee glaube das klappt nicht denn wenn ich das hinzufüge wird der Spinner immer in die Reihe von der Listview hinzugesetzt. Dann hat man z.B: Übung + Spinner in einer Listview Reihe.

MFG Chris 92
 
Ist gut Danke hab ne andere Lösung gefunden wie ich es machen will.

Hab nur ne noch ne andere Frage kann man irgendwie testen wieviele Datenbank sich auf der SD Karte befinden? Denn ich will testen ob sich schon ein Benutzer registriert hat wenn ja dann wird er sofort in das Hauptmenü geschickt wenn nicht dann zuerst in die Registrierungs Activity.

MFG Chris92
 
Hallo Chris92,

bin mir nicht sicher was du genau meinst.

Vorab. Deine Datenbank ist eine Datei in deinem Beispiel hast du Sie als "AlleUebungen.db" bezeichnet.

In dieser Datei gibt es Tabellen. Du benutzt soweit ich weis eine. Die Tabelle besteht aus mehreren Spalten oder auch Feldnamen. Jeder Eintrag wird als Datensatz bezeichnet.

Soweit die Begriffserklärung:

Wie stellst du dir die Regstrierung (Anmeldung) der Benutzer vor? Du kannst dazu eine weitere Tabelle beisp. "User" in der Datenbank anlegen. In dieser Tabelle suchst du dann nach den User.

Oder möchtest du lediglich die Übeungen einer Person zuordnen. Dann empfehle ich dir eine Tabelle "Person" mit den Feldnamen "_id, Name, Gewicht, Gebdatum" etc. anzulegen

Das Gebatum ist sinnvoll damit doppelte Einträge vermieden werden. Zwei Personen mit dem Namen Hans Müller und dem selben Geburtsdatum gibt es selten. Kannst auch Telefonnummer nehmen und diesen als Einzigartig (Unique) deklarieren.

Nun musst du nur noch deine Übungen mit den Personen verbinden. Ich würde die Tabelle "Training" nennen. Diese Tabelle erhält die Feldnamen "_id, idPerson, idAlleUebungen, datum, ZeitAnfang, ZeitEnde" usw.

Wenn nun eine angemeldete Person eine Übung macht, packst du die entsprechende id der Person und die id der Uebung in die Tabelle Training. Kannst noch weitere Einträge wie Zeitpunkt etc. hinzufügen.

Später kannst du über eine Select-Anweisung diese 3 Tabellen in eine Ausgeben und zB. zeigen was eine Person in einem bestimmten Zeitraum für Übungen gemacht hat.

Ich hoffe was war jetzt nicht zu viel. Wenn du das hin bekommst hast du schon einiges geschaft. Die Verknüpfung einzelner Tabellen wie in diesem Beispiel sind extrem hilfreich und auch wichtig.

Für dein Schulprojekt kann ich dir wärmstens SQL empfehlen. Google mal, du wirst einiges finden.

Gruß enrem
 
Ja genau so mach ich es vielen dank für den Tipp nur hab ich eine Frage wenn ich mich jetzt einloggen will, teste ich die Tabelle ab ob sich ein Eintrag mit dem Username befindet. Doch irgendwie ist der Test immer wahr. Keine Ahnung an was es liegt.
Hier mal mein Code:
Code:
 String path = "/sdcard/Training.db";
                mDB = SQLiteDatabase.openOrCreateDatabase(path, null); 
                String sql = "SELECT count(*) FROM Users Where Login = '"+Test+"'";
                Cursor cur = mDB.rawQuery (sql, null);
                if (cur.getCount() > 0) {
                    cur.moveToFirst();
                    txtTest.setText(sql);   
                }
 
Chris92 schrieb:
Ja genau so mach ich es vielen dank für den Tipp nur hab ich eine Frage wenn ich mich jetzt einloggen will, teste ich die Tabelle ab ob sich ein Eintrag mit dem Username befindet. Doch irgendwie ist der Test immer wahr. Keine Ahnung an was es liegt.
Hier mal mein Code:
Code:
 String path = "/sdcard/Training.db";
                mDB = SQLiteDatabase.openOrCreateDatabase(path, null); 
                String sql = "SELECT count(*) FROM Users Where Login = '"+Test+"'";
                Cursor cur = mDB.rawQuery (sql, null);
                if (cur.getCount() > 0) {
                    cur.moveToFirst();
                    txtTest.setText(sql);   
                }

MFG Chris92
 
OK eine Empfehlung.

Packe alles in eine Datenbank. Du hast ja eine angelegt die sich nennt AlleUebungen.db. Behalte die und packe da eine Tabelle Training und eine Tabelle Users hinein. Würde nicht mit mehreren Datenbanken (*.db) arbeiten. Du kannst später bessere joins realisieren.

Deine Select ist soweit ok aber du verwendest eine agregatfunktion. Du wirst immer einen Datensatz bekommen da in feld Count die Anzahl der gefundenen Datensätze steht.

Mit cursor.getCount() bekommst du die anzahl der tatsächlichen Datensätze im Objekt Cursor zurück. Also es kann durchaus sein das in Cursort 10 Einträge (Datensätze) stehen. Dann gibt getCount() 10 zurück. Entweder musst du bei deiner Metode den Inhalt von Feld Count des Cursors abfragen oder du verwendest meine Metode.

Beispiel: Hast du in der Tabelle Users ein Feld mit dem Namen "Vorname" kannst du folgende select anwenden.

Select * from Users Where Vorname != NULL

Damit bekommst du alle Datensätze deren Inhalt Vorname nicht null ist. Vorsicht null und eine leere Zeichenkette ist was anderes. Sonst musst du mit != "" prüfen.

Du kannst ja auch deine _id abfragen.

Select * from Users Where _id > 0

oder schöner

Select _id from Users Where _id > 0

Hier kannste was nachlesen.

Datatypes In SQLite Version 3

Im Cursor kannst du dann die treffer mit getCount() abfragen.

Du kannst später auch einen bestimmten user abfragen.

Select * from Users Where Vorname = "Chris"

Jetzt würden alle Benutzer mit dem Vornamen Chris in den Cursor zurück gegeben.

Hier siehst du wie ich was prüfe, war zu bequem es auf deinen Code abzuleiten, ich hoffe es hilft trotzdem.

Code:
        if(mBundle.getLong("_id")>0){
            sql = "SELECT * FROM MESSDATEN WHERE _id = "+mBundle.getLong("_id");
        }else{
            // Neuanlage
            sql = "SELECT * FROM MESSDATEN";
        }
        Cursor cur = mDB.getDatabase().rawQuery (sql, null);
        
        if (cur != null) {
            // Move ist wichtig, damit der Zeiger nicht über einen Datensatz hinaus geht.
            cur.moveToLast();
            // Letzter Eintrag anbieten. Bei einer eindeutigen _id ist das halt der
            // eine Datensatz.
            if(cur.getCount() > 0){
                mMenge = cur.getLong(cur.getColumnIndexOrThrow("Menge"));
                mRatingAussehen = cur.getFloat(cur.getColumnIndexOrThrow("Aussehen"));
                mRatingEmpfinden = cur.getFloat(cur.getColumnIndexOrThrow("Empfinden"));
                mFilter.setText(cur.getString(cur.getColumnIndexOrThrow("Messfilter")));
            }
        }

Du machst das soweit gut, nur weiter so. Wenn du SQL ein wenig begriffen hast, kannst du sehr viel realisieren. SQL lohnt sich.

Gruß enrem
 
Zuletzt bearbeitet:
Danke hat geklappt ich arbeite auch nur mit 2 Datenbanken. 1 Datenbank wo Tabellen drin sind die nicht verändert werden, die nur genutzt wird um Informationen in der App anzuzeigen und eine Datenbank wo alle Informationen rein kommen die geändert werden können.

Kennst du vieleicht eine Seite wo Beispiele stehen über SQL in Android denn irgendwie klappt das nicht wenn ich testen will Select * FROM Tabellenamen Where Feld1 = Text and Feld2 = Text2
Also ein Where mit mehreren Conditionen.

MFG Chris92
 
Ist gut hab den Fehler gefunden wieso es nicht ging würde mich aber freuen wenn du vieleicht so eine Seite kennst

MFG Chris92
 
Ich freue mich das du klar kommst. Das mit den beiden Datenbanken ist gut.

Du kannst durchaus nach SQL googeln. SQLite ist ne abgespeckte SQL Variante, die grundlegenden Dinge findest du unter auch unter SQL.

Bin eine Woche nicht zuhause. Daher keine Links. Habe aber mal gegoogelt. Anbei ein paar Links:

SQL ? Wikipedia

Sql lernen - ein Tutorial zum Selbststudium mit einer Beispiel-Datenbank

Einführung in SQL: Beispieldatenbank: SQLite ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

Ich habe da noch einen guten Tipp!!! :)

Du verwendest den SQLite Manager in Firefox. Wenn du Datensätze änderst oder anlegst, löschst usw. bekommst du vorher die SQL Anweisung angezeigt. Ist sehr hilfreich.

Du kannst dort auch eigene SQL-Anweisungen angeben und vorher schauen ob Sie funktioniert. Musst nicht immer im Code probieren.

Viel Spaß

Gruß enrem
 
Danke.

Ich hab ne frage kann man irgendwie eine Tabelle in eine andere Tabelle kopieren denn ich hab eine Funktion in meiner App: Fertiges Training wo er ein Training von uns vorgeschlagen bekommt und wenn er jetzt ein Training auswählt soll dieses Training in die Tabelle FTrainingsplan kopiert werden.

Oder muss ich jeden einzelnen Eintrag aus der Tabelle des ausgewählten Trainings herausnehmen und einzeln einsetzen?

MFG Chris92
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.051
jogimuc
J
A
Antworten
10
Aufrufe
1.022
swa00
swa00
C
Antworten
8
Aufrufe
1.127
swa00
swa00
Zurück
Oben Unten