4

以下查詢在我的設備(API 15)上正常運行。它不會在我的模擬器上工作運行API 8或API 10Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER no such列

下面是該查詢:

Cursor contactsCur = getContentResolver().query(
    ContactsContract.Data.CONTENT_URI, 
    new String[] { ContactsContract.Data._ID, 
    ContactsContract.Data.CONTACT_ID, 
    ContactsContract.Data.DISPLAY_NAME, 
    ContactsContract.CommonDataKinds.Organization.COMPANY, 
    ContactsContract.CommonDataKinds.Phone.TYPE, 
    ContactsContract.Data.LOOKUP_KEY, 
    ContactsContract.CommonDataKinds.Phone.NUMBER, 
    Contacts.Data.MIMETYPE, 
    ContactsContract.CommonDataKinds.Phone.MIMETYPE, 
    ContactsContract.CommonDataKinds.StructuredPostal.CITY, 
    ContactsContract.CommonDataKinds.StructuredPostal.STREET, 
    ContactsContract.CommonDataKinds.StructuredPostal.REGION, 
    ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE}, 
    ContactsContract.Data.HAS_PHONE_NUMBER + " >? ", 
    new String[] { "0" }, 
    ContactsContract.Data.DISPLAY_NAME + " COLLATE NOCASE ASC"); 

這裏是它拋出異常: android.database.sqlite.SQLiteException: no such column: has_phone_number: , while compiling: SELECT _id, contact_id, display_name, data1, data2, lookup, data1, mimetype, mimetype, data7, data4, data8, data9 FROM view_data_restricted data WHERE (1) AND (has_phone_number >?) ORDER BY display_name COLLATE NOCASE ASC

奇怪的是,下面的代碼也不起作用:

Cursor contactsCur = getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
    new String[] { ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER}, 
    ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + " >? ", 
    new String[] { "0" }, 
    null); 

它產生:java.lang.IllegalArgumentException: Invalid column has_phone_number

http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html指出ContactsContract.CommonDataKinds.Phone訪問HAS_PHONE_NUMBER從接口android.provider.ContactsContract.ContactsColumns

爲了增加陌生感,這個查詢的工作:

Cursor contactsCur = getContentResolver().query(
    ContactsContract.Data.CONTENT_URI, 
    new String[] { ContactsContract.Data.LOOKUP_KEY}, 
    null, 
    null, 
    null); 

但是這一次沒有:

Cursor contactsCur = getContentResolver().query(
    ContactsContract.Data.CONTENT_URI, 
    new String[] { ContactsContract.Data.HAS_PHONE_NUMBER}, 
    null, 
    null, 
    null); 

ContactsContract.Data.LOOKUP_KEY來自與ContactsContract.Data.HAS_PHONE_NUMBER相同的隱式連接!

我哪裏錯了?

+0

如果我沒有記錯的話,你需要使用'ContactsContract。 Contacts.CONTENT_URI'而不是'ContactsContract.Data.CONTENT_URI'。這將生成額外列的implict連接。 – Codo 2012-08-05 14:26:36

+0

更改爲'ContactsContract.Contacts.CONTENT_URI'給了我'java.lang.IllegalArgumentException:無效的列contact_id' – gnub 2012-08-05 19:54:18

+0

http://developer.android.com/reference/android/provider/ContactsContract.Data.html使它看起來像' HAS_PHONE_NUMBER'應該可以通過與'ContactsContract.Contacts'的隱式連接來使用。 – gnub 2012-08-05 19:59:50

回答

5

您遇到的主要問題是ContactsContract.CommonDataKinds.Phone.CONTENT_URI自動過濾器has_phone_number=1。所以你可以保證,所有出來的Phone.CONTENT_URI確實有一個電話號碼。然後,您可以通過檢查Phone.TYPE是否爲Phone.TYPE_MOBILEPhone.TYPE_WORK_MOBILE(例如)之一來進一步過濾,例如,如果您想限制其電話號碼的類型。


供參考(注意:has_phone_numberdata/phones URI缺席):

Columns for content://com.android.contacts/contacts: 
- times_contacted 
- contact_status 
- custom_ringtone 
- has_phone_number 
- phonetic_name 
- phonetic_name_style 
- contact_status_label 
- lookup 
- contact_status_icon 
- last_time_contacted 
- display_name 
- sort_key_alt 
- in_visible_group 
- _id 
- starred 
- sort_key 
- display_name_alt 
- contact_presence 
- display_name_source 
- contact_status_res_package 
- contact_status_ts 
- photo_id 
- send_to_voicemail 

和:

Columns for content://com.android.contacts/data/phones: 
- data_version 
- phonetic_name 
- phonetic_name_style 
- contact_id 
- lookup 
- data12 
- data11 
- data10 
- mimetype 
- data15 
- data14 
- data13 
- display_name_source 
- data_sync1 
- data_sync3 
- data_sync2 
- data_sync4 
- account_type 
- custom_ringtone 
- status 
- data1 
- data4 
- data5 
- data2 
- data3 
- data8 
- data9 
- group_sourceid 
- data6 
- account_name 
- data7 
- display_name 
- in_visible_group 
- display_name_alt 
- contact_status_res_package 
- is_primary 
- contact_status_ts 
- raw_contact_id 
- times_contacted 
- contact_status 
- status_res_package 
- status_icon 
- contact_status_icon 
- mode 
- version 
- last_time_contacted 
- res_package 
- _id 
- name_verified 
- status_ts 
- dirty 
- is_super_primary 
- photo_id 
- send_to_voicemail 
- name_raw_contact_id 
- contact_status_label 
- status_label 
- sort_key_alt 
- starred 
- sort_key 
- contact_presence 
- sourceid 
+0

你提供了很多幫助我的信息。謝謝。 – 2014-05-03 12:25:59

相關問題