【问题标题】:Android get contacts name and number queryAndroid获取联系人姓名和号码查询
【发布时间】:2011-03-30 11:55:11
【问题描述】:

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

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

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

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


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

这可以通过其他更快的方式完成吗?

提前致谢

【问题讨论】:

    标签: android mysql sql android-contacts


    【解决方案1】:

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

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

    【讨论】:

    • @Maxim 感谢您回答旧帖子!您确定要这样做吗?
    • @mixkat 我想是的。光标有两列。 [0] - 显示名称 [1] - 电话号码。我检查了它对我有用。
    • @Maxim 对我来说,它为所有联系人返回相同的号码!
    • @Maxim 如何处理同一个联系人下的多个条目?
    • @mixkat 这取决于你想要什么。我只需要一个数字,所以我制作数组并删除所有具有重复名称的项目(最好在投影中添加contact_id字段并删除具有相同contact_id的项目)。如果您想构建所有联系人的电话,您可以构建更复杂的结构。向内容提供者查询所需的时间少于 400 次(对于每个联系人)
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我也这么认为!但是就没有别的办法了吗?每次需要数字列表时(即每次调用该特定方法时)我可能都需要更新,因为自从您上次更新以来联系人可能已经改变,所以这对我来说并不是一个真正的解决方案!
    • @mixkat 这个链接可能有用 [link]stackoverflow.com/questions/1401280/…
    • @mixkat 我有这个问题的解决方案。我已将其发布为另一个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多