当我尝试从手机的联系人列表中获取电话号码时。问题是,当我在手机中的联系人列表为空时运行应用程序时,应用程序已停止。我检查了一下,这是因为光标是空的。
如何检查光标是否为空或手机联系人列表中是否有联系人?
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();
答案 0 :(得分:42)
测试“有效”光标的一般模式是
((cursor != null) && (cursor.getCount() > 0))
Contacts Provider不会返回null,但是如果遇到某种数据错误,其他内容提供商可能会这样做。内容提供程序应该处理异常,将游标设置为零,并记录异常,但不能保证。
答案 1 :(得分:24)
使用cursor.getCount() == 0
。如果为true,则光标为空
答案 2 :(得分:8)
我添加了一个投影,因此您只能获得所需的列。
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();
}
答案 3 :(得分:4)
试试这个。您的代码的问题是它将执行add而不管游标的长度。我将phone.moveToFirst()括在if语句中,因为如果游标为空或没有记录集,它将返回false。
if(phones.moveToFirst()){
do{
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}while(phones.moveToNext())
} else {
//do something else
}
答案 4 :(得分:4)
public boolean isCursorEmpty(Cursor cursor){
return !cursor.moveToFirst() || cursor.getCount() == 0;
}
答案 5 :(得分:1)
cursor.moveToFirst();
if (cursor.isBeforeFirst()) //means empty result set
; //do your stuff when cursor is empty
在isBeforeFirst()
运作良好之后 moveToFirst()
。
isBeforeFirst(): 返回光标是否指向第一行之前的位置。
答案 6 :(得分:1)
System.out.println("count "+ cursor.getCount());
这将在logcat
中显示光标的值