Probleme mit Cursor

  • Antworten:4
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 18

28.11.2012, 21:57:33 via Website

Hallo zusammen,

ich habe folgendes Problem und hoffe, ihr könnt mir einen Tipp geben.
Meine APP besitzt eine DB. Die Werte werden mit einem Cursor in eine Listview ausgelesen. Soweit läuft das auch super.

Nun habe ich folgendes Problem:
meine Listview enthält ein ContextMenu, das durch tippen und halten aufgerufen wird. Hier soll es nun "Aendern" geben.
Der Cursor soll nun mit info.id die ID des ListView-Eintrags auslesen, die Werte aus der Tabelle holen und sie per Intent in die neue Activity schicken.
Abundzu funktioniert es, aber meistens bekomme ich:

android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)


Hier mein QC

1case R.id.change:
2
3 long i = info.id;
4
5 dbCursor = dbHandler.queryhaus();
6 int ciFach = dbCursor.getColumnIndex(DBopenHandler.FACH);
7 int ciBeschreibung = dbCursor.getColumnIndex(DBopenHandler.BESCHREIBUNG);
8 int ciAbgabe = dbCursor.getColumnIndex(DBopenHandler.ABGABE);
9
10
11
12 int id = (int) i;
13
14
15 dbCursor.moveToPosition(id);
16
17 int fach = dbCursor.getInt(ciFach);
18 String beschreibung = dbCursor.getString(ciBeschreibung);
19 String abgabe = dbCursor.getString(ciAbgabe);
20
21
22 Intent intent = new Intent(Anzeige_Hausaufgaben.this, Create_Hausaufgaben_Andern.class);
23 intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
24 intent.putExtra("fach", fach);
25 intent.putExtra("beschreibung", beschreibung);
26 intent.putExtra("abgabe", abgabe);
27 intent.putExtra("id", info.id);
28
29 startActivity(intent);



Danke schonmal für die Hilfe

Mo

Antworten
Christian
  • Forum-Beiträge: 307

29.11.2012, 15:51:06 via Website

Hi Mo K.,

also die Fehlermeldung:

android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)

besagt das du auf eine "Position" im Cursor zugreifst die nicht da ist. Diese Exception ist vergleichbar mit der IndexOutofBoundsException bei einem Array.

Leider fehlt in deiner Fehlermeldung der Teil der sich auf deinen Code bezieht deshalb vermute ich jetzt einfach mal das Problem liegt hier:
1dbCursor.moveToPosition(id);
2
3int fach = dbCursor.getInt(ciFach);
4String beschreibung = dbCursor.getString(ciBeschreibung);
5String abgabe = dbCursor.getString(ciAbgabe);


Du castest diene id von einem "long" in "int" dabei gehen Daten verloren. Ist das soweit Ok. Soll heißen stimmt die ID dann auch noch mit der überein die in der DB steht?

So jetzt zu deinem Code.
Wenn ich das richtig verstehe liest du mit:

dbCursor = dbHandler.queryhaus();
die komplette Tabelle aus und dann gehst du mit dem Cursor an die Stelle die du brauchst.
Warum machst du das?

Wär es nicht einfacher du holst dir nur den Datensatz den du brauchst und bearbeitest nur diesen?
Beispiel: SELECT aufgabe FROM hausaufgaben WHERE id = 1;

mfg Christian

— geändert am 29.11.2012, 15:52:46

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

29.11.2012, 17:26:25 via Website

Hallo Christian,

erstmal vielen Dank für deine Antwort.

Hier der gesamte Logcat-Eintrag:

11-29 16:12:27.881: E/AndroidRuntime(277): FATAL EXCEPTION: main
11-29 16:12:27.881: E/AndroidRuntime(277): android.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5
11-29 16:12:27.881: E/AndroidRuntime(277): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
11-29 16:12:27.881: E/AndroidRuntime(277): at kerk.moritz.fo4.Anzeige_Prufungen.onContextItemSelected(Anzeige_Prufungen.java:149)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.app.Activity.onMenuItemSelected(Activity.java:2199)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2744)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:874)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.widget.ListView.performItemClick(ListView.java:3382)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.os.Handler.handleCallback(Handler.java:587)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.os.Handler.dispatchMessage(Handler.java:92)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.os.Looper.loop(Looper.java:123)
11-29 16:12:27.881: E/AndroidRuntime(277): at android.app.ActivityThread.main(ActivityThread.java:4627)
11-29 16:12:27.881: E/AndroidRuntime(277): at java.lang.reflect.Method.invokeNative(Native Method)
11-29 16:12:27.881: E/AndroidRuntime(277): at java.lang.reflect.Method.invoke(Method.java:521)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-29 16:12:27.881: E/AndroidRuntime(277): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-29 16:12:27.881: E/AndroidRuntime(277): at dalvik.system.NativeStart.main(Native Method)





Du castest diene id von einem "long" in "int" dabei gehen Daten verloren. Ist das soweit Ok. Soll heißen stimmt die ID dann auch noch mit der überein die in der DB steht?

Mein Log spuckt mir die rowID der Tabelle aus, wenn ich etwas erstelle. Ich habe zur Kontrolle long sowie int auf die ID überprüft, alle stimmen überein!
Das seltsame ist, bei manchen Einträgen geht es, bei manchen werden falsche Werte angezeigt und bei vielen :grin: stürzt die App ab.


So jetzt zu deinem Code.
Wenn ich das richtig verstehe liest du mit:

dbCursor = dbHandler.queryhaus();
die komplette Tabelle aus und dann gehst du mit dem Cursor an die Stelle die du brauchst.

Genau korrekt.


Wär es nicht einfacher du holst dir nur den Datensatz den du brauchst und bearbeitest nur diesen?
Beispiel: SELECT aufgabe FROM hausaufgaben WHERE id = 1;

Wahrscheinlich schon, jedoch weiß ich nicht, wie ich das anstellen soll..
Ist es möglich, dass der orderBY-String meine query-Methode an der Exception schuld ist? Der sortiert die Tabelle nach Datum...

Viele Grüße

Moritz

Antworten
Christian
  • Forum-Beiträge: 307

29.11.2012, 18:03:33 via Website

Hi Mo K.

Wahrscheinlich schon, jedoch weiß ich nicht, wie ich das anstellen soll..

eine einfache Abfrage:
SELECT Aufgabe FROM hausaufgaben WHERE id = 1;

Skizze:
Tabelle hausaufgaben
-------------------------------
| Id | Aufage | Datum |
-------------------------------
| 1 | Mathe | 12.12.2012
| 2 | Deutsch| 13.12.2012

ich hoffe die "Skizze" ist verständlich.

So um jetzt diese Abfrage umzusetzen benötigst du ein Objekt der Klasse SQLiteDatabase.

1SQLiteDatabase db = getReadableDatabase();
2
3Cursor cursor = db.query(
4 false, //distinct
5 "hausaufgaben", //Tabelle
6 new String[] { //Select
7 "aufgabe"
8 },
9 "id = ?", //Where
10 new String[]{ //Parameter für Where
11 "1"
12 },
13 null, // GROUP BY
14 null, //HAVING
15 null, //ORDER BY
16 null //LIMIT
17);
Den Code findest du ein wenig übersichtlicher bei GitHub:gist

Ist es möglich, dass der orderBY-String meine query-Methode an der Exception schuld ist? Der sortiert die Tabelle nach Datum.
Nein da ein orderBy nur die ausgelesenen Datensätze sortiert.

mfg Christian

— geändert am 29.11.2012, 18:11:22

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

29.11.2012, 19:19:30 via Website

Top!

1public Cursor querychange(String id)
2
3 {
4 Log.i("String public Cursor", id);
5
6 SQLiteDatabase db = getReadableDatabase();
7
8 /* Cursor cursor = */
9
10 return db.query(
11 false, //distinct
12 TABLE_NAME_HAUS, //Tabelle
13 new String[] { FACH, BESCHREIBUNG, ABGABE},
14 _ID + " = ?", //Where
15 new String[]{ //Parameter für Where
16 id },
17 null, // GROUP BY
18 null, //HAVING
19 null, //ORDER BY
20 null //LIMIT
21
22 );
23 }

mit
1dbCursor.moveToFirst();
verfeinert funktioniert einwandfrei.

Vielen Dank!

Grüße Moritz

Antworten