我正在尝试创建一个过滤联系人的查询,以仅检索具有特定帐户类型的联系人。
我使用以下代码在Android 2.2上运行,但不适用于较新的机器人(如android 4.4.2):
private void testQuery() {
String selection = ContactsContract.Contacts._ID + " IN (" + "SELECT " +
ContactsContract.RawContacts.CONTACT_ID + " FROM " +
"raw_contacts" + " WHERE " +
ContactsContract.RawContacts.ACCOUNT_TYPE + " IS NULL OR " +
ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.google'" + ")";
Cursor c = null;
try {
c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
null,
selection,
null, null);
} catch(Exception e) {
e.printStackTrace();
}
if(c != null) {
int indexName = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
while(c.moveToNext()) {
String name = c.getString(indexName);
// TODO:
}
c.close();
}
}
问题是它适用于Android 2.2,但它在新的android(android 4.4.2)上引发了一个异常。例外是:SQLiteException:没有这样的列:account_type。
我不知道为什么这对新的机器人不起作用,但我认为这是一个安全功能。
问题:我试图解决这个问题的解决方法吗?
当前的解决方案:我目前的解决方案是我发出2个查询,一个在raw_contact表中,另一个在联系表中。这种方法的问题在于它非常慢且笨拙,我不能使用漂亮的CursorLoader来处理重新加载数据时导致非常非常难看和难以维护的代码。
感谢所有帮助。
更新:请参阅下面的新解决方案。
答案 0 :(得分:0)
我已经解决了旧机器人和新机器人的问题。问题是我应该使用视图" view_raw_contacts"而不是表" raw_contacts"。适用于我测试的所有机器人。
更新了选择:
String selection = ContactsContract.Contacts._ID + " IN (" + "SELECT " +
ContactsContract.RawContacts.CONTACT_ID + " FROM " +
"view_raw_contacts" + " WHERE " +
ContactsContract.RawContacts.ACCOUNT_TYPE + " IS NULL OR " +
ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.google'" + ")";
在真实设备上,我使用正则表达式提取视图名称,希望它可以在所有设备上运行,即使是那些修改了联系提供者的人。