web-dev-qa-db-de.com

android.database.CursorIndexOutOfBoundsException: Angeforderter Index mit einer Größe von

Ich verwende einen benutzerdefinierten Adapter, der den Cursoradapter zur Anzeige von Daten in der Listenansicht erweitert. Um bestimmte Telefonnummern anzuzeigen, habe ich die ID an eine Methode in der Datenbankklasse übergeben, die jedoch angezeigt wird 

errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

beim Platzieren des Debuggers in der Methode wird die Zeile nicht nachgeführt

num = cursor.getString(cursor.getColumnIndex("ContactNumber"));

Kann mir jemand helfen, es zu lösen ... Dies ist der Code:

public String getNumberFromId(int id) 
{
    String num;
    db= this.getReadableDatabase();
    Cursor cursor = db.query(scheduletable, new String[] { "ContactNumber" },"_id="+id, null, null, null, null);
    cursor.moveToFirst();
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close();
    db.close();
    return num;
}
45
user181291

Wann immer Sie mit Cursors zu tun haben, überprüfen Sie IMMER auf Null und überprüfen Sie moveToFirst() ohne Fehler.

if( cursor != null && cursor.moveToFirst() ){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
    cursor.close(); 
}

Platzieren Sie die Protokolle entsprechend, um zu sehen, ob es null oder einen leeren Cursor zurückgibt. Überprüfen Sie Ihre Anfrage entsprechend.

Update Setze beide Schecks in einer einzigen Anweisung, wie von Jon in dem Kommentar unten angegeben. 

Update 2 Bringt den Aufruf close() in den gültigen Cursorbereich.

102
Shubhayu

versuchen Sie Folgendes: Dies verhindert, dass eine Ausnahme ausgelöst wird, wenn der Cursor leer ist.

if(cursor != null && cursor.moveToFirst()){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close();
}
17
ngesh

Überprüfen Sie zuerst diese Bedingung, bevor Sie Daten abrufen 

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
}
11
Khan

Überprüfen Sie den Rückgabewert von moveToFirst(), bevor Sie versuchen, etwas vom Cursor zu lesen. Es sieht so aus, als würden keine Ergebnisse zurückgegeben.

7
Graham Borland

ein Speicherschema zur Abfrage von Cursors ist

// just one
Cursor cursor = db.query(...);
if (cursor != null) {
    if (cursor.moveToFirst()) {
        value = cursor.getSomething();
    }
    cursor.close();
}

// multiple columns
Cursor cursor = db.query(...);
if (cursor != null) {
    while (cursor.moveToNext()) {
        values.add(cursor.getSomething());
    }
    cursor.close();
}
5
zapl

versuchen Sie, die App zu deinstallieren und dann erneut zu testen ... Die sqlite-Datenbankdatei wird nur einmal erstellt, wenn die App zum ersten Mal installiert wird ... Wenn Sie also der Meinung sind, dass Ihre Logik aktuell ist, wird die Neuinstallation der App für Sie die Lösung sein. !!!!

0
Abhishek Dhyani

Falls die Leute noch suchen:

Statt nach "ContactNumber" zu suchen, suchen Sie nach Phone.NUMBER. Das Tutorial enthält den Code mit weiteren Details: http://developer.Android.com/training/basics/intents/result.html

0
Pouton Gerald