【发布时间】:2012-08-02 12:05:06
【问题描述】:
以下查询在我的设备 (API 15) 上运行良好。它在我运行 API 8 或 API 10 的模拟器中不起作用。
这里是查询:
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 可以从接口android.provider.ContactsContract.ContactsColumns 访问HAS_PHONE_NUMBER
更奇怪的是,这个查询有效:
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 相同的隐式连接!
我哪里错了?
【问题讨论】:
-
如果我没记错的话,你需要使用
ContactsContract.Contacts.CONTENT_URI而不是ContactsContract.Data.CONTENT_URI。这将为其他列生成隐式连接。 -
改成
ContactsContract.Contacts.CONTENT_URI给了我java.lang.IllegalArgumentException: Invalid column contact_id -
developer.android.com/reference/android/provider/… 使
HAS_PHONE_NUMBER看起来应该可以通过与ContactsContract.Contacts的隐式连接获得 -
您找到解决方案了吗?
标签: android android-emulator android-contacts contactscontract android-sqlite