Android API 8, 10 ContactsContract.Data.HAS_PHONE_NUMBER brak takiej kolumny

Poniższe zapytanie działa poprawnie na moim urządzeniu (API 15). Nie działa w moim emulatorze z interfejsem API 8 lub API 10.

Oto zapytanie:

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

Oto wyjątek, który rzuca: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

Co dziwne, następujący kod również nie działa:

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

Daje:java.lang.IllegalArgumentException: Invalid column has_phone_number

http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html stwierdza, żeContactsContract.CommonDataKinds.Phone ma dostęp doHAS_PHONE_NUMBER Z interfejsu android.provider.ContactsContract.ContactsColumns

Aby dodać dziwności, to zapytanie działa:

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

Ale ten nie robi:

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

ContactsContract.Data.LOOKUP_KEY pochodzi z tego samego niejawnego połączenia jakContactsContract.Data.HAS_PHONE_NUMBER !

Gdzie się mylę?

questionAnswers(1)

yourAnswerToTheQuestion