2012-04-20 27 views
37

Używam adaptera adaptera dostosowującego kursor niestandardowy do wyświetlania danych w widoku listy, do wyświetlenia konkretnego numeru telefonu Podałem identyfikator do metody w klasie bazy danych, ale pokazujeandroid.database.CursorIndexOutOfBoundsException: wymagany indeks 0, o rozmiarze 0

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

podczas umieszczania debuggera w metodzie nie idzie po linii

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

Może ktoś mi pomóc go rozwiązać. Jest to kod:

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; 
} 

Odpowiedz

7

Sprawdź wartość zwracana z moveToFirst(), zanim spróbujesz odczytać coś z kursorem. Wygląda na to, że żadne wyniki nie są zwracane.

15

spróbować tego .. To pozwoli uniknąć wyjątek wyrzucane gdy kursor jest pusty ..

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

ten kod działa dla mnie ... Tak bardzo chciałem. –

+2

Ten kod ulegnie zawieszeniu na cursor.close(), jeśli kursor ma wartość null. – Mark

+0

Czy równie dobrze jest sprawdzić 'if (cursor.getCount()! = 0)'? –

91

Kiedy masz do czynienia z kursorów należy sprawdzić za nieważną i sprawdzić moveToFirst() bezbłędnie.

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

kłody Place odpowiednio, aby zobaczyć, czy jest to powrót null lub pusty kursora. Zgodnie z tym sprawdź zapytanie.

Aktualizacja Połóż obie kontrole w pojedynczym zestawieniu, o czym wspomniał Jon w komentarzu poniżej.

Aktualizacja 2 Połóż wywołanie close() w prawidłowym zakresie kursora.

+2

Ze względu na leniwą ocenę Javy '&&' można po prostu zrobić 'if (cursor! = Null && cursor.moveToFirst()) {...}' –

+1

Dzięki za wskazanie tego. zaktualizowałem to :) – Shubhayu

+0

Wielkie dzięki @Shubhayu To rozwiązało mój problem. – indraja

4

strzał schematu kwerendy Cursor S

// 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(); 
} 
10

Najpierw należy sprawdzić ten warunek przed pobierania danych

if(cursor!=null && cursor.getCount()>0){ 
    cursor.moveToFirst(); 
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
} 
Powiązane problemy