6

android 2.1で正常に動作するアプリケーションがありますが、3.0に移行しようとすると、慣れていないカーソルエラーが発生します。

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

すべてのデータはSQLiteデータベースに保存され、このコードはandroid2.1で正常に機能します。Android 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();
        }
 }
4

5 に答える 5

2

今日、同じエラー メッセージが表示されました。結局、列名をタイプミスしただけでした。したがって、それでも当てはまる場合は、列名にタイプミスがないか確認してください。大文字と小文字も区別されることに注意してください。私にとってのエラーは次のようなものでした:

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

//Was correct
c.getColumnIndex("Articlenumber");
于 2011-08-10T11:49:21.380 に答える
1

getColumnIndex が -1 を返す場合、列は存在しません。それ以外の場合は、0 から始まる列インデックスを返します。

于 2012-02-08T10:18:02.907 に答える
1

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

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

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

于 2011-07-22T19:18:24.937 に答える
1

-1 は、すべての sqlite テーブルが必要とする _id 列であり、Android フレームワークで必要とされます。インデックスに +1 を追加する必要がある場合は、どこかで問題が発生しています。

于 2012-03-21T23:46:25.590 に答える
0

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

于 2013-02-11T15:00:34.017 に答える