如何在联系人 Android 上添加查询

How to fasten a query on Contacts Android

在我的Android应用程序中,一个Activity用于显示用户phone中的联系人列表。 问题是该操作需要大约 3 秒才能执行,不用说这是完全不能接受的。 这是我使用的代码:

private List<Contact> retrieveContacts(ContentResolver contentResolver) {
        LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
        List<Contact> listContacts = new ArrayList<Contact>();
        final Cursor cursor = contentResolver.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[] {
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
                null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        if (cursor == null);
        if (cursor.moveToFirst() == true) {
            do {
                final String name = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                final String telephone = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                Contact contact = new Contact(telephone, name, false, false);
                contactSet.add(contact);

            } while (cursor.moveToNext() == true);
        }

        if (cursor.isClosed() == false) {
            cursor.close();
        }
        for (Contact contact : contactSet){
            listContacts.add(contact);
        }
        return listContacts;
    }

然后我用 retrieveContacts 的结果填充一个 ListView。 我正在使用 LinkedHashSet,因为它不接受重复,并且会保留用于添加元素的顺序。 (我需要保留该订单)

这种查询的标准是要花那么多时间吗?有什么方法可以提高它的性能吗?

您可以使用一些优化来提高代码的性能。虽然我认为这是次要的。

  1. name和number列获取一次后存储索引
  2. 您可以使用 ArrayList 构造函数实现删除最后一个 for 循环。

下面是我编写这段代码的方式:

private List<Contact> retrieveContacts(ContentResolver contentResolver) {
    LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
    final Cursor cursor = contentResolver.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] {
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
            null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
    if (cursor == null);
    if (cursor.moveToFirst()) {
        int nameIndex = cursor
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
        int phoneIndex = cursor
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        do {
            final String name = cursor
                    .getString(nameIndex);
            final String telephone = cursor
                    .getString(phoneIndex);
            Contact contact = new Contact(telephone, name, false, false);
            contactSet.add(contact);

        } while (cursor.moveToNext());
    }

    if (!cursor.isClosed()) {
        cursor.close();
    }

    return new ArrayList<Contact>(contactSet);
}