SimpleCursorAdapter anstatt ArrayAdapter benutzen

ensacom

ensacom

Ambitioniertes Mitglied
6
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));
    }
 
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.
 
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
 
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);
    }
}
 
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:
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);
    }
}
 
Und das mit dem CursorToStringConverter war Quatsch von mir. ViewBinder wird hier gebraucht!
Der Converter wird zum Beispiel beim AutoCompletion verwendet.
 
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.
 
Siehe anderer Thread. Schau Dir mal ein paar Beispiele aus den Samples an. Da kann man sich viel Code herauskopieren.
 
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
 
Warum bekommt man mit

String aColumnString = theCursor.getString(1);

nur null und nicht die ID des Datensatzes zurück?
 
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....
 
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..
 
Ok, die Frage mit der Schleife nehme ich zurück.
Aer eins geht definitiv nicht. _id wird immer 0 angezeigt.
 
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.
 
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');");
 
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.
 
Eine Frage: Schließt der CursorAdapter den Cursor selber oder muss ich den Cursor selber schließen?
 

Ähnliche Themen

J
Antworten
5
Aufrufe
846
swa00
swa00
D
Antworten
9
Aufrufe
2.246
deek
D
Zurück
Oben Unten