基于raw_contact ACCOUNT_TYPE查询android联系人

时间:2014-03-26 09:43:15

标签: android android-contentresolver

我正在尝试创建一个过滤联系人的查询,以仅检索具有特定帐户类型的联系人。

我使用以下代码在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来处理重新加载数据时导致非常非常难看和难以维护的代码。

感谢所有帮助。

更新:请参阅下面的新解决方案。

1 个答案:

答案 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'" + ")";

在真实设备上,我使用正则表达式提取视图名称,希望它可以在所有设备上运行,即使是那些修改了联系提供者的人。