1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

SimpleCursorAdapter anstatt ArrayAdapter benutzen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ensacom, 19.05.2009.

  1. ensacom, 19.05.2009 #1
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Hallo, wer kann mir sagen wie ich den folgenden text so umstellen kann, dass ich anstatt ArrayAdapter den SimpleCursorAdapter verwenden kann?

    Hier mein Quelltext

    Code:
    public class fahrzeuge extends ListActivity {
        SQLiteDatabase myDB = null; 
        ArrayList<String> results = new ArrayList<String>();  
        
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            
            myDB = this.openOrCreateDatabase(ensacom1.MY_DATABASE_NAME, MODE_PRIVATE, null);        
            Cursor c = myDB.rawQuery("SELECT id, name, model FROM " + ensacom1.MY_DATABASE_TABLE + ";", null);
            int kfzIDColumn  = c.getColumnIndex("id");
            int kfzNameColumn  = c.getColumnIndex("name");
            int kfzModelColumn = c.getColumnIndex("model");
            startManagingCursor(c);
            c.moveToFirst();
         
            if (c != null) {
              if (c.isFirst()) {
                     int i = 0;
                  
                     do {
                          i++;
         
                          String kfzid = c.getString(kfzIDColumn);
                          String kfzname = c.getString(kfzNameColumn);
                          String kfzmodel = c.getString(kfzModelColumn);
                          results.add(kfzid + ": "+ kfzname + " - " + kfzmodel);
                     } while(c.moveToNext());
                  }
            }
            this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
        }
    
     
  2. friedger, 21.05.2009 #2
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Wo hakt es denn?

    Ich würde einfach etwas wie folgt machen: (ungetester Code)

    Code:
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item1, cursor, new String[]{BaseColumns._ID}, new String[]{android.R.id.text1});
    
    adapter.setCursorToStringConvert(new CursorToStringConverter(){
      public CharSequence convertToString(Cursor theCursor) 
             {               
                     String aColumnString = theCursor.getString(1); 
     String bColumnString = theCursor.getString(2); 
                     return aColumnString + "," +bColumnString; 
             } 
    });
    
    Wenn das nicht reicht kann man auch über den ViewBinder gehen und Icon, etc. setzen.
     
  3. ensacom, 21.05.2009 #3
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Wo es hackt?

    Es hackt bereits daran dass ich nicht genau weiß wo ich das einfügen soll.

    CursorToStringAdapter kennt er gar nicht.

    Ich habe ja in meinem Beispiel alle Einträge aus der Datenbank in einem array stehen das ich nun an die Liste übergeben muss. Wie ich das sehe muss ich bei SimpleCursorAdapter 2 Strings übergeben, wobei ich auch nicht weiß was BaseColumns._ID sein soll
     
  4. friedger, 21.05.2009 #4
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Hier die komplette Klasse, ich hoffe es hilft weiter. Sonst musst Du nochmal nachfragen:

    Code:
    package de.friedger.a.test;
    
    import java.util.ArrayList;
    
    import android.app.ListActivity;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.provider.BaseColumns;
    import android.widget.SimpleCursorAdapter;
    import android.widget.SimpleCursorAdapter.CursorToStringConverter;
    
    public class Fahrzeuge extends ListActivity {
    
        SQLiteDatabase myDB = null;
        ArrayList<String> results = new ArrayList<String>();
    
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
    
            myDB = this.openOrCreateDatabase("mydb", MODE_PRIVATE, null);
            Cursor c = myDB.rawQuery("SELECT id, name, model FROM " + "myTable"
                    + ";", null);        
            startManagingCursor(c);    
    
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                    android.R.layout.simple_list_item_1, c,
                    new String[] { BaseColumns._ID },
                    new int[] { android.R.id.text1 });
    
            adapter.setCursorToStringConverter(new CursorToStringConverter() {
                public CharSequence convertToString(Cursor theCursor) {
                    String aColumnString = theCursor.getString(1);
                    String bColumnString = theCursor.getString(2);
                    return aColumnString + "," + bColumnString;
                }
            });
    
            this.setListAdapter(adapter);
        }
    }
    
     
  5. ensacom, 21.05.2009 #5
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Also gleich beim AUfrufen der activity stürzt sie ab mit unbekanntem Fehler

    Was hat es mit der zeile auf sich?

    Code:
    new int[] { android.R.id.text1 });
    Ich denke an der liegt es oder auch nicht.

    Eine layout.xml brauche ich ja nicht da das Layout hier direkt im code erzeugt wird oder?
     
    Zuletzt bearbeitet: 21.05.2009
  6. friedger, 21.05.2009 #6
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Wie kommst Du darauf? LogCat sagt bestimmt was anderes. Der CursorAdapter verlangt nämlich, dass es eine Spalte "_id" gibt.

    Also jetzt habe ich den Code auch getestet:
    Code:
    
    package de.friedger.test;
    
    import java.util.ArrayList;
    
    import android.app.ListActivity;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.provider.BaseColumns;
    import android.view.View;
    import android.widget.SimpleCursorAdapter;
    import android.widget.TextView;
    import android.widget.SimpleCursorAdapter.CursorToStringConverter;
    import android.widget.SimpleCursorAdapter.ViewBinder;
    
    public class Fahrzeuge extends ListActivity {
    
        SQLiteDatabase myDB = null;
        ArrayList<String> results = new ArrayList<String>();
    
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
    
            myDB = this.openOrCreateDatabase("mydb2", MODE_PRIVATE, null);
             myDB.execSQL("CREATE TABLE IF NOT EXISTS " + "myTable"
                        + " (_id integer AUTO_INCREMENT PRIMARY KEY, name varchar(100), model varchar(100), bemerkungen varchar(255), kraftstoffart varchar(100))"
                        +";");
             myDB.execSQL("INSERT INTO "+"myTable"+" (name, model, bemerkungen, kraftstoffart) "
                     +"VALUES ('Audi','TT','Keine Bemerkung','Super');");
    
             
            Cursor c = myDB.rawQuery("SELECT _id, name, model FROM " + "myTable"
                    + ";", 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 aColumnString = theCursor.getString(1);
                    String bColumnString = theCursor.getString(2);
                    ((TextView)view).setText(aColumnString + "," + bColumnString);
                    
                    return true;
                }
            });
    
            this.setListAdapter(adapter);
        }
    }
    
    
     
  7. friedger, 21.05.2009 #7
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Und das mit dem CursorToStringConverter war Quatsch von mir. ViewBinder wird hier gebraucht!
    Der Converter wird zum Beispiel beim AutoCompletion verwendet.
     
  8. ensacom, 21.05.2009 #8
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Super, also das funktioniert jetzt.
    Nur wie kann ich nun nach anklicken eines Eintrages in der Liste die ID auslesen?

    Die will ich dann nämlich zum abfragen weiterer Daten aus der DB benutzen.
     
  9. friedger, 21.05.2009 #9
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Siehe anderer Thread. Schau Dir mal ein paar Beispiele aus den Samples an. Da kann man sich viel Code herauskopieren.
     
  10. ensacom, 21.05.2009 #10
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Ja aber nur wenn man schon was mit Java gemacht hat.

    Nur noch eine Frage die nur zum Teil mit dem Thema zu tun hat.

    Kann man eine durch das Programm erstellte Datenbank nicht mehr löschen?
    Habe es schon versucht mit

    myDB.execSQL("DROP DATABASE TankPro;");

    worauf das Programm aber gleich wieder abstürzt
     
  11. ensacom, 21.05.2009 #11
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Warum bekommt man mit

    String aColumnString = theCursor.getString(1);

    nur null und nicht die ID des Datensatzes zurück?
     
  12. friedger, 21.05.2009 #12
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Die Spalten fangen bei 0 an. Spalte 1 ist im Beispiel oben "name". Da id ein Long ist würde ich auch sowas wie cursor.getLong(0) verwenden.

    Bezüglich "drop table" würde wieder LogCat weiterhelfen. Vielleicht gibt es die Tabelle nicht, vielleicht brauchst Du die Tabelle wieder, obwohl sie weg ist. Vielleicht ist noch der Cursor offen und die Datei damit gelockt. Alles geraten....
     
  13. ensacom, 21.05.2009 #13
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Wo muss ich eigentlich die Schleife einbauen dass alle Datensätze ausgelesen werden und nicht nur einer?

    Ich kapiere Java nicht, habe aber die Hoffnung noch mal dahinterzusteigen..
     
  14. ensacom, 21.05.2009 #14
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Ok, die Frage mit der Schleife nehme ich zurück.
    Aer eins geht definitiv nicht. _id wird immer 0 angezeigt.
     
  15. friedger, 21.05.2009 #15
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Ja, das ist merkwürdig. Das INSERT-Statement fügt keine IDs ein, obwohl die Spalte als auto_increment steht.

    Das ist aber eine Spezialität von Sqlite3. Man muss NULL in die _id Spalte einfügen, damit die IDs gesetzt werden. Dann klappts.
     
  16. friedger, 22.05.2009 #16
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Außerdem muss es autoincrement heißen und nach primary key stehen. Also alles zusammen:

    Code:
     myDB.execSQL("CREATE TABLE IF NOT EXISTS " + "myTable"
                        + " (_id integer PRIMARY KEY AUTOINCREMENT, name varchar(100), model varchar(100), bemerkungen varchar(255), kraftstoffart varchar(100))"
                        +";");
     myDB.execSQL("INSERT INTO "+"myTable"+" (_id, name, model, bemerkungen, kraftstoffart) "
                     +"VALUES (null, 'Audi','TX','Keine Bemerkung','Super');");
    
     
  17. ensacom, 22.05.2009 #17
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Ja also ich habe jetzt gemerkt dass es an der funktion zum erzeugen der Datenbank lag.
    Also das geht jetzt alles.

    Das einzige was ich noch nicht kapiere ist, wie bekomme ich wenn ich einen Eintrag in der Liste anklicke, die ID des Eintrages aus der Datenbank zurück?

    Ich kann doch nicht im onClick der Liste auf den cursor und damit auf die ID der Liste zugreifen.
     
  18. lord_fritte, 11.06.2011 #18
    lord_fritte

    lord_fritte Fortgeschrittenes Mitglied

    Beiträge:
    312
    Erhaltene Danke:
    7
    Registriert seit:
    15.11.2009
    Phone:
    Samsung Galaxy S4
    Eine Frage: Schließt der CursorAdapter den Cursor selber oder muss ich den Cursor selber schließen?
     

Diese Seite empfehlen