如何使用Data.HAS_PHONE_NUMBER

时间:2012-03-15 15:07:02

标签: android android-contentprovider android-contacts

我对如何使用Data.HAS_PHONE_NUMBER有点困惑。 我已插入联系人以及一些其他数据,我想检索其中一些联系人。

如果我正在运行以下代码,那么就可以了:

Uri uri = Data.CONTENT_URI;
String[] projection = new String[]{Data.CONTACT_ID, Data.DISPLAY_NAME };
String selection = Data.DATA4+" = ?";
String[] selectionArgs = new String[] {MY_VALUE};


Cursor truContactCursor = mContext.getContentResolver().query(uri, projection, selection, selectionArgs, null);

现在,我想知道这些联系人是否有电话号码,所以我将HAS_PHONE_NUMBER添加到投影中,如下所示:

String[] projection = new String[]{Data.CONTACT_ID, Data.DISPLAY_NAME, Data.HAS_PHONE_NUMBER };

运行查询时,我得到以下execption:

java.lang.IllegalArgumentException: Invalid column has_phone_number

为什么我无法访问HAS_PHONE_NUMBER? Data.DISPLAY_NAME在同一个表中没有问题。我们如何假设使用Data.HAS_PHONE_NUMBER呢?

感谢您的回答

3 个答案:

答案 0 :(得分:0)

使用HAS_PHONE_NUMBER用于检查联系人是否至少有一个电话号码。例如:

ContentResolver cr = getContentResolver();  
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if(cursor.getCount()>0){
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));id
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if(cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))>0){
//Query phone here. 
}

或添加投影:

String [] projection = {ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

答案 1 :(得分:0)

将“Data.MIMETYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE”添加到选择语句中。

结果光标将仅包含具有电话号码的行。

提示即可。 有这种情况:一个联系人中有几个号码。 如果要查询所有数字,请将“ContactsContract.Data.DATA1”(表示电话号码)添加到投影语句中。

答案 2 :(得分:0)

我遇到了同样的问题,我发现问题的唯一其他参考是另一个stackoverflow question

我打算自己编写ContentProvider来通过程序化方式进行“加入”。也就是说,针对Data.CONTENT_URI进行原始查询,但不进行Data.HAS_PHONE_NUMBER投影,然后针对Data.HAS_PHONE_NUMBER的实际值重新查询给定的联系人。这肯定缺乏实际DB连接的性能(是n + 1类型的选择),但会提供所需/预期的功能。这种额外的处理可以以操作系统级别为条件,以保持正确运行的OS版本的效率。

鉴于 yulistic 上面的回答和我自己的经验,在某些Android版本中似乎是一个错误,这个隐式连接没有完成。我的Android v2.3.7手机因投影中Data.HAS_PHONE_NUMBER时收到的错误而崩溃,而我的Android v4.2.2平板电脑没有崩溃。

我已针对此问题输入了Android Bug: https://code.google.com/p/android/issues/detail?id=54095

罗布