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))

Contacts Provider 不会返回 null,但如果其他内容提供者遇到某种数据错误,他们可能会这样做。内容提供者应该处理异常,将光标设置为零,并记录异常,但不能保证。

于 2013-02-21T20:19:16.590 回答
25

使用cursor.getCount() == 0. 如果为真,则光标为空

于 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 。我将phones.moveToFirst() 包含在if 语句中,因为如果光标为空或没有记录集,它将返回false。

  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 回答