25

電話の連絡先リストから電話番号を取得しようとしているとき。問題は、電話の連絡先リストが空のときにアプリを実行すると、アプリが停止することです。確認しましたが、カーソルが空だからです。

カーソルが空であるかどうか、または電話の連絡先リストに連絡先があるかどうかを確認するにはどうすればよいですか?

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

7 に答える 7

51

「有効な」カーソルをテストするための一般的なパターンは次のとおりです。

((cursor != null) && (cursor.getCount() > 0))

連絡先プロバイダーはnullを返しませんが、他のコンテンツプロバイダーは、何らかのデータエラーが発生した場合にnullを返す可能性があります。コンテンツプロバイダー、例外を処理し、カーソルをゼロに設定し、例外をログに記録する必要がありますが、保証はありません。

于 2013-02-21T20:19:16.590 に答える
25

を使用しcursor.getCount() == 0ます。trueの場合、カーソルは空です

于 2013-02-21T19:40:34.527 に答える
9

必要な列だけを取得できるように、プロジェクションを追加しました。

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();
}
于 2013-02-21T19:50:43.230 に答える
4

これを試してください。コードの問題は、カーソルの長さに関係なく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
   }
于 2013-02-21T19:40:45.337 に答える
4
public boolean isCursorEmpty(Cursor cursor){
   return !cursor.moveToFirst() || cursor.getCount() == 0;
}
于 2014-12-01T15:02:29.673 に答える
2
System.out.println("count "+ cursor.getCount());

これにより、カーソルの値が表示されますlogcat

于 2018-07-24T17:25:42.880 に答える
1
cursor.moveToFirst();
if (cursor.isBeforeFirst()) //means empty result set
        ; //do your stuff when cursor is empty

isBeforeFirst()仕事の後moveToFirst()もうまくいきます。

カーソルのドキュメントによると:

isBeforeFirst():カーソルが最初の行の前の位置を指しているかどうかを返します。

于 2016-03-05T22:29:59.703 に答える