2011-07-21 14 views
6

Mam aplikację, która działa dobrze na Androidzie 2.1, ale przy próbie przejścia do wersji 3.0 pojawia się błąd kursora, którego nie znam.Android 3.0 Nie można odczytać wiersza #, kolumny # z okna kursora

java.lang.IllegalStateException: Nie można odczytać row0, kolumnę -1 od oknie kursora. Upewnij się, że kursor jest poprawnie zainicjowany, zanim uzyska on dostęp do danych z niego.

Wszystkie dane są przechowywane w bazie danych SQLite i ten kod działa poprawnie w systemie Android 2.1. Czy kursor musi być zainicjalizowany inaczej w Android 3.0?

Poniżej znajduje się mój kod.

private void OpenGroupData(){ 
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null); 
Cursor cur = db.rawQuery("SELECT groupid FROM properties GROUP BY GroupID" + ";" , null); 
LinearLayout glayout = (LinearLayout) findViewById(R.id.Grouplayout); 
LinearLayout gwindow = (LinearLayout) findViewById(R.id.groupwindow); 

TextView data = new TextView(this); 
glayout.addView(data); 
data.setText(""); 
int ID = cur.getColumnIndex("groupid"); 
int idvalue; 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 

try{ 
    // Check if our result was valid. 
    cur.moveToFirst(); 
    if (cur != null) { 

     // Loop through all Results 
     do {data = new TextView(this); 
      data.setTextSize(20); 
     data.setClickable(true); 
     data.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       GroupClick(v); 
      } 
      }); 
     glayout.addView(data); 
     idvalue = cur.getInt(ID); 
     data.setId(idvalue); 
     data.setText("Group: " + idvalue); 
     }while(cur.moveToNext()); 
     } 
     cur.close(); 
     db.close(); 
     } catch(Exception e) { 
      Toast.makeText(getApplicationContext(), "Open Group Exception: " + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
} 

Odpowiedz

1

W porządku, wymyśliłem to. Z jakiegoś powodu próbując przetransferować moją aplikację do wersji 3.0, gdy mój kursor idzie i pobiera indeks kolumny dla pola, w tym przypadku ("groupid") zwraca wartość -1. Kiedy Kursor spróbuje zacząć od -1, ulega awarii, ponieważ nie może znaleźć rekordu w wierszu (0), kolumnie (-1). Tak więc moja poprawka polegała na dodaniu jednego do indeksu kolumny podczas pobierania identyfikatora. patrz poniżej.

int ID = cur.getColumnIndex("groupid") + 1; 
int idvalue; 

Dodanie 1 do indeksu Column wydaje się rozwiązać problem.

+0

Miałem dokładnie ten sam problem i to naprawiło - dziękuję! +1 – Matt

2

Wystąpiłem tego samego komunikatu o błędzie wcześniej tego dnia. Okazało się tylko, że wpisałem literówkę w nazwie kolumny. Tak więc, jeśli nadal obowiązuje, możesz iść i sprawdzić nazwę kolumny dla literówki. Zwróć uwagę, że jest również wrażliwy na wielkość liter. Błąd dla mnie był następujący:

//Trew error 
c.getColumnIndex("ArticleNumber"); 

//Was correct 
c.getColumnIndex("Articlenumber"); 
+1

Możesz spróbować użyć publicznego statycznego końcowego String ARTICLE_NUMBER = "numer artykułu" i zawsze wskazywać na tę wartość. Więc jeśli masz w klasie o nazwie DBConstants, wykonaj coś takiego: c.getColumnIndex (DBConstants.ARTICLE_NUMBER). W ten sposób nigdy nie uzyskasz literówek :) – DecodeGnome

1

Jeśli getColumnIndex zwraca -1, to kolumna nie istnieje. Otherwize powraca do indeksu kolumny opartego na zera.

+0

tak, to jest poprawne. moja nazwa kolumny to "nazwa", ale jest dostępna jako getColumnIndex ("Nazwa"). po zmianie nazwy na nazwisko zadziałało – Senthil

1

-1 to kolumna _id, którą powinien mieć każdy tabela sqlite, zgodnie z wymaganiami platformy Android. Jeśli musisz dodać +1 do indeksu, gdzieś się nie udaje.

0

Wartość -1 zwraca postać getColumnIndex (columnName), jeśli nie można znaleźć "columnName". Sprawdź nazwy kolumn:

Powiązane problemy