リストビューでデータを表示するためにカーソルアダプタを拡張するカスタムアダプタを使用しています。特定の電話番号を表示するには、データベースクラスのメソッドにIDを渡しましたが、表示しています
errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
メソッドにデバッガーを配置している間、それは行の後に行かない
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
誰でも私がそれを解決するのを助けることができます。これはコードです:
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;
}
カーソルを扱うときは常に、常にnullをチェックし、moveToFirst()
を必ずチェックします。
_if( cursor != null && cursor.moveToFirst() ){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
_
ログを適切に配置して、null
または空のカーソルを返しているかどうかを確認します。それに応じて、クエリを確認してください。
更新以下のコメントでJonが言及したように、両方のチェックを1つのステートメントに入れます。
更新2有効なカーソルスコープ内にclose()
呼び出しを配置します。
これを試してください。これは、カーソルが空のときに例外がスローされるのを防ぎます。
if(cursor != null && cursor.moveToFirst()){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
データを取得する前に、まずこの条件を確認してください
if(cursor!=null && cursor.getCount()>0){
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
}
カーソルから何かを読み取ろうとする前に、moveToFirst()
からの戻り値を確認してください。結果が返されないように見えます。
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();
}
アプリをアンインストールしてからもう一度テストしてみてください...実際にアプリが最初にインストールされたときに一度だけsqlite dbが作成されるので、ロジックが最新であると思われる場合は、アプリを再インストールするとうまくいきます。 !!!!
まだ人々が見ている場合:
"ContactNumber"
を検索する代わりに、Phone.NUMBER
を検索してみてください。チュートリアルには、詳細が記載されたコードがあります。 http://developer.Android.com/training/basics/intents/result.html