1

我正在尝试检索所有联系人的显示名称和电话号码,但我希望它只返回具有数字的行。

目前我有这样的,它的工作原理:

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE");
while (cur.moveToNext()) 
{           
    if ( Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
    {
                        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));                    
                        contacts[index] = name;                                 

                        Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                        pCur.moveToFirst();                                 
                        numbers[index] = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        index++;
                        pCur.close();
        }

问题是加载大约需要 4-5 秒,因为它运行了cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);大约 400 次。


现在我的理解是联系人的姓名和号码保存在不同的表格中,您需要姓名的 id 才能获取号码。

这可以以任何其他方式更快地完成吗?

提前致谢

4

2 回答 2

5

@mixkat 我想出了另一种解决方案。

只需一个查询即可获取姓名和电话数据。

这是代码:

    String WHERE_CONDITION = ContactsContract.Data.MIMETYPE + " = '" +   ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'";
    String[] PROJECTION = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.DATA1};
    String SORT_ORDER = ContactsContract.Data.DISPLAY_NAME;

    Cursor cur = context.getContentResolver().query(
            ContactsContract.Data.CONTENT_URI,
            PROJECTION,
            WHERE_CONDITION,
            null,
            SORT_ORDER);

在这种情况下,您查询的不是联系提供商而是直接查询数据提供商。

于 2011-04-28T14:35:48.647 回答
1

我也有同样的问题。我通过在用户第一次打开应用程序时将联系人保存在数据库中来解决它。而不是我更新数据(应用程序何时更新联系人由您决定)。

所以应用程序使用我的数据库表中的联系人,其中姓名和号码在一行中。它需要更少的时间。

于 2011-03-30T12:27:40.420 回答