電話の連絡先リストから電話番号を取得しようとしているとき。問題は、電話の連絡先リストが空のときにアプリを実行すると、アプリが停止することです。チェックしましたが、これはカーソルが空だからです。
カーソルが空かどうか、または電話の連絡先リストに連絡先があるかどうかを確認するにはどうすればよいですか?
ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
lstPhoneNumber = new ArrayList<String>();
phones.moveToFirst();
// The problematic Line:
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER)));
while (phones.moveToNext()) {
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
phones.close();
プロジェクションを追加したので、必要な列だけを取得できます。
String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, null, null, null);
if (phones == null)
return; // can't do anything with a null cursor.
try {
while (phones.moveToNext()) {
lstPhoneNumber.add(phones.getString(0));
}
} finally {
phones.close();
}
「有効な」カーソルをテストする一般的なパターンは次のとおりです。
((cursor != null) && (cursor.getCount() > 0))
連絡先プロバイダーはnullを返しませんが、何らかのデータエラーが発生した場合、他のコンテンツプロバイダーはnullを返す場合があります。コンテンツプロバイダーshould例外を処理し、カーソルをゼロに設定し、例外をログに記録しますが、保証はありません。
cursor.getCount() == 0
を使用します。 trueの場合、カーソルは空です
public boolean isCursorEmpty(Cursor cursor){
return !cursor.moveToFirst() || cursor.getCount() == 0;
}
これを試してください。コードの問題は、カーソルの長さに関係なくaddを実行することです。カーソルが空であるか、レコードセットがない場合はfalseを返すため、phones.moveToFirst()をifステートメントで囲みます。
if(phones.moveToFirst()){
do{
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}while(phones.moveToNext())
} else {
//do something else
}
System.out.println("count "+ cursor.getCount());
これにより、logcat
にカーソルの値が表示されます
_cursor.moveToFirst();
if (cursor.isBeforeFirst()) //means empty result set
; //do your stuff when cursor is empty
_
isBeforeFirst()
の後のmoveToFirst()
もうまく機能します。
カーソルのドキュメント によると:
isBeforeFirst():カーソルが最初の行の前の位置を指しているかどうかを返します。