【问题标题】:How i do get all contacts including raw contacts in under 5 seconds我如何在 5 秒内获得所有联系人,包括原始联系人
【发布时间】:2018-07-19 22:57:31
【问题描述】:

我想获取所有联系人数据,包括所有原始联系人。 我提到了这个link

这是我正在使用的代码:

Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,    Long.valueOf(raw_contact_id));
Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);

Cursor c = getContentResolver().query(entityUri,
        new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1,
                Entity.DATA2, Entity.DATA3, Entity.DATA4, Entity.DATA5, Entity.DATA6, Entity.DATA7,
                Entity.DATA8, Entity.DATA9, Entity.DATA10, Entity.DATA11, Entity.DATA12, Entity.DATA13,
                Entity.DATA14/* , Entity.DATA15 */ },
        null, null, null);

try {
    while (c.moveToNext()) {
        String sourceId = c.getString(0);
        if (!c.isNull(1)) {
            String mimeType = c.getString(2);
            // if (!mimeType.contains("photo")) {
            String data1 = c.getString(3);
            String data2 = c.getString(4);
            String data3 = c.getString(5);
            String data4 = c.getString(6);
        }
    }
} finally {
    c.close();
}

问题是这段代码的实现需要花费大量时间来获取所有联系人数据。

有没有其他方法可以在 5 秒内获取联系人数据。

【问题讨论】:

  • 你想得到什么样的数据?
  • 为什么您需要一次获取所有数据。只需在需要时获取数据。
  • 如果不需要,不要从所有列中获取数据
  • 我需要构成特定联系人的所有原始联系人的电话号码、电子邮件、组织、事件、关系、组、地址、结构化名称等。工作项目需要它。请分享一些想法。
  • 速度取决于您拥有的联系数据量。 1000 个联系人将轻松超过您的 5s 要求。为什么不异步进行查询,仅在加载所有数据后才显示结果。

标签: android


【解决方案1】:

这是我获取姓名和电子邮件地址的方式,您也可以检索其他数据

ArrayList<String> emailAddressList = new ArrayList<String>();
ArrayList<String> contactNameList = new ArrayList<String>();

HashSet<String> emlRecsHS = new HashSet<String>();

ContentResolver cr = getContentResolver();
String[] PROJECTION = new String[] {ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.Contacts.DISPLAY_NAME};

String order = "CASE WHEN "
        + ContactsContract.Contacts.DISPLAY_NAME
        + " NOT LIKE '%@%' THEN 1 ELSE 2 END, "
        + ContactsContract.Contacts.DISPLAY_NAME
        + ", "
        + ContactsContract.CommonDataKinds.Email.DATA
        + " COLLATE NOCASE";


String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";

Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);
if (cur.moveToFirst())
{
    do
    {
        // names comes in hand sometimes
        String emlAddress = cur.getString(0);
        String contactName = cur.getString(1);

        // keep unique only
        if (emlRecsHS.add(emlAddress.toLowerCase(Locale.US)))
        {
            emailAddressList.add(emlAddress);
            contactNameList.add(contactName);
        }
    } while (cur.moveToNext());
}

cur.close();

【讨论】:

  • 感谢您的回答,但我面临的问题是关于过程中消耗的时间...
  • @ManvendraSah 我在我的设备上试过这个,它会在一秒钟内加载所有数据。
  • 我需要所有数据,包括 raw_contact_ids、地址、结构化名称、组、事件。与该 raw_contact_id 关联的组织、网站、imHandles 等。这可以在 5 秒内完成吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 2011-07-13
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多