0

私はdbからデータを読み取る機能を持っていますが、これは常にエラーを返します..私はAndroidで多くの知識を持っていません..いくつかの助けを探しています

10-03 11:33:05.870: E/AndroidRuntime(1321): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.myworldsafe/com.projects.myworldsafe.DeailedView}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content  FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);   
 c.moveToFirst();
 int index= c.getCount();
 int indexd= c.getColumnIndex(ITEM_CONTENT); 
 System.out.print("Count query"+indexd);
 return c.getString(index);
}
4

7 に答える 7

2

これを使って:

return c.getString(indexd);

それはあなたが実際に価値を得たいものです。そこで使用indexすると、カーソル内のレコード数が返されます。

また、より良い方法は次のとおりです。

String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content  FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);   
if(c.getCount()>0){
    c.moveToFirst();
    int index= c.getCount();
    int indexd= c.getColumnIndex(ITEM_CONTENT); 
    System.out.print("Count query"+index);// use index instead of indexd to print total records in query
    return c.getString(index);// return value of column number specified in indexd
}
else
    return "";// when no records found
}
于 2012-10-03T06:17:55.913 に答える
0

データベースを確認してください。クエリはサイズ0のカーソルを返しているため、インデックス0のカーソルにアクセスしようとしているため、エラーが発生します。クエリを再考し、データベースで値を確認してください。

于 2012-10-03T06:20:42.950 に答える
0

ここに正しいコードがあります

int index= c.getCount(); // this will return total rows found
int indexd= c.getColumnIndex(ITEM_CONTENT);  // this is the column index by giving the column name.
System.out.print("Count query"+indexd);
return c.getString(indexd); // here you need to pass the column index but you passing the index which was total number of rows
于 2012-10-03T06:18:24.930 に答える
0
Cursor c=db.rawQuery(selectQuery,params);   

サイズ0のカーソルを返している場合は、カーソルにアイテムがあるかどうかを確認するようにコードを変更してから、次の方法で最初の位置に移動します。

Cursor c=db.rawQuery(selectQuery,params);   
if(c.getCount()>0)
{
 c.moveToFirst();
int index= c.getCount();
 int indexd= c.getColumnIndex(ITEM_CONTENT); 
 System.out.print("Count query"+indexd);
 return c.getString(index);
}
return "";
于 2012-10-03T06:18:44.780 に答える
0

空の結果セットから読み取ろうとしているようです。

于 2012-10-03T06:19:18.750 に答える
0

0 行カーソルにアクセスしている可能性があります。への変更 :

// moveToFirst itself will return false if there is no entry on Cursor
if(c.moveToFirst()){
    int cursorCount = c.getCount();
    int indexd = c.getColumnIndex(ITEM_CONTENT); 
    System.out.print("Count query"+index);
    // You should getString(ColumnIndex) not CursorCount
    return c.getString(indexd);
} else
    return "";
于 2012-10-03T06:23:34.397 に答える
0

列番号の代わりにレコード数を渡しているため、範囲外のインデックス例外が発生しています。ベスト コーディング プラクティスとして、レコードのカーソルをチェックします。つまり、カーソルが空であるか、レコードを含んでいます。これを使って

String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content  FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);   
if(c.getCount()>0){
c.moveToFirst();
int index= c.getCount();
int indexd= c.getColumnIndex(ITEM_CONTENT); 
System.out.print("Count query"+index);
return c.getString(indexd);
}
else
return "";// when no records found
}
于 2012-10-03T06:25:04.020 に答える