2011-07-21 13 views
6

アンドロイド2.1で正常に動作するアプリケーションがありますが、3.0に移行しようとするとカーソルエラーが発生します。Android 3.0カーソルの行から行番号、列番号を読み取ることができません

Java.lang.IllegalStateException:は、列-1 カーソル・ウィンドウからのROW0を読み取れませんでした。 からデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。

すべてのデータはSQLiteデータベースに格納されており、このコードはAndroid 2.1で正常に動作します。アンドロイド3.0ではカーソルを別々に初期化する必要がありますか?

以下は私のコードです。

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

答えて

1

申し訳ありません。何らかの理由で、私のカーソルが移動してフィールドの列インデックスを取得したときにアプリケーションを3.0に変換しようとすると、この場合( "groupid")、値-1が返されます。カーソルが-1で開始しようとすると、行(0)、列(-1)でレコードが見つからないため、クラッシュします。だから私の修正は、IDを取得するときに列インデックスに1つ追加することでした。下記参照。

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

列インデックスに1を追加すると、問題が解決したようです。

+0

私はまったく同じ問題を抱えていましたが、これが修正されました - ありがとう! +1 – Matt

2

同じエラーメッセージが表示されました。それがわかったのは、私が列名にタイプミスをしたことでした。したがって、まだ適用されている場合は、タイプミスの列名を確認してください。大文字と小文字は区別されます。 getColumnIndexが-1を返した場合、その列が存在しない

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

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

あなたはpublic static final String ARTICLE_NUMBER = "articleNumber"を試してみることができ、常にその値を指します。だからクラスにDBConstantsという名前をつけたら、次のようにする:c.getColumnIndex(DBConstants.ARTICLE_NUMBER)。こうしてあなたは決してタイプミスを得ることはありません:) – DecodeGnome

1

:私のエラーは、の線に沿っていました。 それ以外の場合は、ゼロベースの列インデックスを返します。

+0

はい正しい。私の列名は "name"ですが、getColumnIndex( "Name")としてアクセスされます。名前を名前に変更した後、 – Senthil

1

-1は、すべてのsqliteテーブルが持つ必要がある_idカラムです。アンドロイドフレームワークで必要です。インデックスに+1を追加する必要がある場合は、どこかで間違っています。

0

'columnName'が見つからない場合、-1値はgetColumnIndex(columnName)という形式を返します。列名を確認してください

関連する問題