在Android上用“手机号码”查询联系人的最快方法

如何解决在Android上用“手机号码”查询联系人的最快方法

|| 我需要从设备及其电话号码中获取所有联系人的明确列表。但是,等等...我们知道某些联系人可能分配了多个号码,这完全取决于每个用户如何存储他的联系人。这是我的工作:
    ContentResolver cr = context.getContentResolver();   
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] { ContactsContract.Contacts._ID,ContactsContract.Contacts.disPLAY_NAME };
    String selection =  ContactsContract.Contacts.HAS_PHONE_NUMBER + \" = \'1\'\";
    String sortOrder = ContactsContract.Contacts.disPLAY_NAME + \" COLLATE LOCALIZED ASC\";
    ArrayList<user> contacts = new ArrayList<user>();

    Cursor users = a.managedQuery(uri,projection,selection,null,sortOrder);

    while (users.movetoNext()) {
        user u = new user();
        u.PhoneId = users.getInt(users.getColumnIndex(ContactsContract.Contacts._ID));
        u.Name = users.getString(users.getColumnIndex(ContactsContract.Contacts.disPLAY_NAME));

        String homePhone = \"\",cellPhone = \"\",workPhone = \"\",otherPhone = \"\";
        Cursor contactPhones = cr.query(Phone.CONTENT_URI,Phone.CONTACT_ID + \" = \" + u.PhoneId,null);

        while (contactPhones.movetoNext()) {

            String number = contactPhones.getString(contactPhones.getColumnIndex(Phone.NUMBER));
            int type = contactPhones.getInt(contactPhones.getColumnIndex(Phone.TYPE));
            switch (type) {
                case Phone.TYPE_HOME:   homePhone = number; break;
                case Phone.TYPE_MOBILE:  cellPhone = number; break;
                case Phone.TYPE_WORK:   workPhone = number; break;
                case Phone.TYPE_OTHER:  otherPhone = number; break;
                }
        }        
        u.Phone = ((cellPhone!=\"\") ? cellPhone : ((homePhone!=\"\") ? homePhone : ((workPhone!=\"\") ? workPhone : otherPhone)));
    }

    return contacts;
该过程有效,但对于我的80个联系人而言,它需要1000-2000毫秒,并且我需要工作得更快:)     

解决方法

Cursor contactPhones = cr.query(Phone.CONTENT_URI,null,Phone.CONTACT_ID + \" = \" + u.PhoneId,null);
这有点次优,因为您是直接在查询中编码联系人ID字段,而不是将其作为参数。这意味着查询解析器必须每次都重新解析查询,而不是能够使用单个缓存的副本。 请提供ID作为参数:
Cursor contactPhones = cr.query(Phone.CONTENT_URI,Phone.CONTACT_ID + \" =? \",new String[] { Integer.toString(u.PhoneId) },null);
ContentResolver.query()
的Javadoc重申了以下指导:   使用问号参数标记(例如\'phone =?\')代替   选择参数中的显式值,以便查询   仅在那些值不同的情况下,缓存才会被识别为相同   目的。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?