Tabellenspalte auslesen

  • Antworten:15
  • Bentwortet
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 08:33:39 via Website

Hallo Zusammen,

ich benötige ein wenig Hilfe für mein Problem. Ich möchte eigentlich nur einen Wert aus meiner erstellten DB abfragen.
Die DB existiert mit Tabelle und diese ist auch gefüllt. Ich kann mir den Inhalt in einer ListView anzeigen lassen.
Problem:
Jetzt möchte ich aber einen bestimmten Wert "Fotoname" auslesen auf dessen ListView-Zeile ich geklickt habe.
Ich rufe die Methode "name" auf und übergebe ihr die eindeutige ID. Als Rückgabewert erwarte ich einen Namen den ich dann in einen String umwandeln möchte.
1@Override
2protected void onListItemClick(ListView l, View v, int position, long id) {
3 dbCursor = dbHandler.name(id);
4 String name = dbCursor.toString();
5}

Die Methode übernimmt die Id und soll somit den Spaltennamen auslesen und diesen zurückgeben.
1public Cursor name(long id) {
2 SQLiteDatabase db = getWritableDatabase();
3 return db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"},"_ID = ?", new String[]{"1"},null, null, null, null );

Mein Rückgabewert ist aber dies:
android.database.sqlite.SQLiteCursor@41a8eed0

LogCat wirft keine Fehler. Kann mir jemand sagen wo der Fehler liegt?

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 08:53:16 via Website

Du musst deinem Cursor noch sagen welche Spalte du gerne ausgelesen haben möchtest.
Cursor.toString() liefert da ganz was anderes.

Ich mach das immer so:
String s = myCursor.getString(myCursor.GetColumnIndex("Spalte"));

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 09:06:01 via Website

Und wo übergebe ich die id? Es könnten doch mehr Einträge in der Spalte vorhanden sein.
Ich dachte mit
1return db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"},"_ID = ?", new String[]{"1"},null, null, null, null );
rufe ich die Tabelle, die Spalte und die dazugehörige id auf.

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 09:35:13 via Website

Ich nehme mal an dass deine ListView durch einen Cursor abgefüllt wurde.
Dann kannst du natürlich auch mittels myCursor.moveToPosition(position) zu angeklickten eingtrag gehen und dann den Inhalt auslesen.

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 09:57:00 via Website

Der Aufruf erfolgt aus einer Klasse:

1// Schnittstelle zur Datenbank
2private eMobilityOpenHandler dbHandler;
3// wird für die Listenansicht benötigt
4private Cursor dbCursor;
5// bildet den Cursor auf die ListView ab
6private eMobilityAdapter listAdapter;
7
8@Override
9protected void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11
12 dbHandler = new eMobilityOpenHandler(this);
13 dbCursor = dbHandler.query();
14 // Activity übernimmt Verwaltung des Cursors
15 startManagingCursor(dbCursor);
16
17 listAdapter = new eMobilityAdapter(this, dbCursor);
18 setListAdapter(listAdapter);
19}

In der SQLiteOpenHelper Klasse steckt die oben aufgerufene Query Methode:

1public Cursor query() {
2// ggf. Datenbank öffnen
3SQLiteDatabase db = getWritableDatabase();
4return db.query(TABLE_NAME_HISTORY, null, null, null, null, null,
5 HISTORY_TIME + " DESC");
6}

Ich dachte die Abfrage über eine Spalte läuft jetzt so ähnlich.
Mache das zum ersten mal und weiß momentan nicht wie dein Aufruf hier hinein passt?

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 10:02:26 via Website

Möchtest du nicht den Inhalt der ListView auslesen?
Möchtest du zusätzliche Infos laden nachdem du dein Eintrag der ListView angewählt hast?

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 10:29:02 via Website

Genau. Die TextView steht und ist anklickbar. Im weiteren Schritt benötige ich jetzt noch einen Namen aus meiner DB. Damit ich weiß welchen Namen ich haben möchte gebe ich die ID mit.

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 10:37:27 via Website

Dann ist dein Aufruf
return db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"},"_ID = ?", new String[]{"1"},null, null, null, null );
schon ok.

ABER: myCursor.toString() liefert dir nicht den Inhalt der Spalte "FOTO" zurück sondern das Cursorobject.

Falls nur ein Eintrag vorhanden ist:
1myCursor.moveToFirst;
2myCursor.getString(myCursor.getColumnIndex("FOTO"));

Dies liefert dir den Inhalt der "FOTO"-Spalte.

Sollten es mehrere Einträge geben kannst du einen Loop über den Cursor machen und die Werte auslesen.

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 11:35:28 via Website

Danke für die Info, ich habe mein Aufruf jetzt folgendermaßen umgestellt:
1String name;
2int num;
3//Aufruf der Methode
4dbCursor = dbHandler.name(id);
5
6num = dbCursor.getCount();
7if(dbCursor!=null && dbCursor.getCount()!=0){
8 dbCursor.moveToFirst();
9 name = dbCursor.getString(dbCursor.getColumnIndex("FOTO"));
10}

Bei " dbCursor.getCount();" bekomme ich 0 raus.
Ich habe die Tabelle auf einen Eintrag reduziert, die übergebene ID nochmal überprüft, kann es an meinen Query liegen?
Hier mal meine Tabelle mit Abfrage:
1private static final String TABLE_MOOD_CREATE = "CREATE TABLE "
2 + TABLE_NAME_HISTORY + " (" + _ID
3 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FOTO + " TEXT, "
4 + HISTORY_TIME + " INTEGER);";

1return db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"},"_ID = ?", new String[]{"1"},null, null, null, null );

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 11:45:02 via Website

Ich vermute dein Select ist nicht gut.

Mach doch mal folgendes:
1String selection = "_ID = ?"
2String[] args = new String[]{"1"}
3
4db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"}, selection, args, null,null,null);

Bei deinem Code hat es 4x null am Schluss. Sollten es nicht nur 3 sein?
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 11:56:35 via Website

Es gibt auch den Query:
1db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

der einzige Unterschied ist das limit am ende

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 12:00:57 via Website

Wieso hast du beim Erstellen die Spalte FOTO aus dem String genommen?
Ist FOTO eine Konstante?

Ich weiss nicht wieso aber hast du schon mal probiert statt _ID _id zu schreiben?

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 13:11:09 via Website

So jetzt habe ich zumindest geschafft, dass er in meine if-Abfrage geht und "dbCursor.getCount();" ist jetzt 1

1return db.query(TABLE_NAME_HISTORY, new String[]{"FOTO"},"_ID = ?",new String[] { Long.toString(id) },null, null, null, null);

Beim weiteren debuggen komme ich jetzt zu der Stelle:
1name = dbCursor.getString(dbCursor.getColumnIndex("FOTO"));

Einen Wert habe ich immer noch nicht. Bekomme jetzt folgende Fehlermeldung:
Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
Wusste gar nicht das es so schwer ist einen Wert aus der Tabelle zu lesen.

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 19:29:43 via Website

Hallo,

leider ist mein Problem immer noch nicht gelöst und solangsam bin ich am verzweifeln.
Das ist meine delete Methode und die funktioniert einwandfrei.
1public void delete(long id) {
2 // ggf. Datenbank öffnen
3 SQLiteDatabase db = getWritableDatabase();
4 int numDeleted = db.delete(TABLE_NAME_HISTORY, _ID + " = ?",
5 new String[] { Long.toString(id) });
6 Log.d(TAG, "delete(): id=" + id + " -> " + numDeleted);
7 }

Hier das Auslesen für meine ListView, funktioniert auch super:
1public Cursor query() {
2 // ggf. Datenbank öffnen
3 SQLiteDatabase db = getWritableDatabase();
4 return db.query(TABLE_NAME_HISTORY, null, null, null, null, null,
5 HISTORY_TIME + " DESC");
6 }

Aber meine Abfrage um aus der Tabelle zu lesen schlägt bei der Ausführung der Query fehl:
1public void test(long id) {
2 // ggf. Datenbank öffnen
3 SQLiteDatabase db = getWritableDatabase();
4 String[] spalten = new String[]{"_ID","FOTO","HISTORY_TIME"};
5
6 cursor = db.query(TABLE_NAME_HISTORY,spalten, _ID + " = ?",new String[] { Long.toString(id) }, null, null, null);

LogCat sagt:
no such column: HISTORY_TIME: , while compiling: SELECT _ID, FOTO, HISTORY_TIME FROM eMobilityHistory WHERE _id = ?

— geändert am 05.12.2012, 19:32:37

Antworten
Dom Santiago
  • Forum-Beiträge: 30

05.12.2012, 20:33:43 via Website

Geschafft, kaum macht man es richtig schon funktioniert es.
Danke an Stefan S. deine Tipps haben in der Gesamtheit dazu beigetragen das es hingehauen hat.
Zum einen habe ich die Query falsch befüllt und zum anderen musste ich dem Cursor "moveToFirst()" zuweisen und schon konnte er die Daten lesen.

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 21:23:28 via Website

dafür sind wir ja da B)
Schön hat es nun geklappt

— geändert am 05.12.2012, 21:23:38

Antworten