【问题标题】:Checking if contact has an email address without a second query检查联系人是否有电子邮件地址而不进行第二次查询
【发布时间】:2014-03-11 02:52:12
【问题描述】:

我是一个非常新的 android 开发人员,我正在尝试用联系人显示名称填充 autocompletetextview,当点击建议时,我希望它自动填充该联系人的电子邮件字段。我设法让它工作,但我的问题是速度。因为我需要获取所有联系人的电子邮件地址,所以我需要对每个联系人进行查询,当我正在测试的设备上有大约 3000 个联系人时,这需要很长时间。问题是,大多数联系人甚至没有电子邮件地址,但我仍然需要查询才能发现。我通过异步任务获取联系人。这里是 doInBackgroundAsyncTask

    protected Object[] doInBackground(ContentResolver...cr) {

    try{
        List<String> names = new ArrayList<String>();
        Map<Integer, String> emails = new HashMap<Integer, String>();
        Map <Integer, List<String>> contacts = new HashMap<Integer, List<String>>();
        /*********** Reading Contacts Name **********/


        //Query to get contact name

        Cursor cur = cr[0]
                .query(ContactsContract.Contacts.CONTENT_URI,
                        null,
                        null,
                        null,
                        null);
        // If data data found in contacts 
        if (cur.getCount() > 0) {


            Log.i("AutocompleteContacts", "Reading   contacts........");

            String name = "";
            String id = "";

            while (cur.moveToNext()) 
            {
                name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                String email = "";
                if(name != null)
                {
                    names.add(name.toString());
                }
                Cursor cur1 = cr[0].query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);
                if(cur1.getCount()>0)
                {
                    while(cur1.moveToNext())
                    {
                        email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        if(email != null)
                        {
                            emails.put(Integer.parseInt(id), email);
                        }
                    }
                }
                cur1.close();
                List<String> line = new ArrayList<String>();
                line.add(name);
                line.add(email);
                contacts.put(Integer.parseInt(id), line);
            }  // End while loop

            } // End Cursor value check
        else
        {
            Log.i("contacts", "No contacts found");
        }
        cur.close();

        results[0] = names;
        results[1] = contacts;
        results[2] = emails;
    } catch (NullPointerException e) {
        Log.i("AutocompleteContacts","Exception : "+ e);
    }
    return results;
}

基本上我的问题是:有没有办法检查联系人是否有电子邮件而无需其他查询,例如HAS_EMAIL_ADDRESS 列或其他内容。

如果您想查看我的应用的完整源代码:https://github.com/michael-elgavi/perlib

【问题讨论】:

  • 您是否有理由不只显示具有thesequestions 等电子邮件地址的联系人?
  • @ianhanniballake 我想自动填写姓名,如果我有电子邮件,我也想填写它

标签: android android-asynctask android-contacts


【解决方案1】:

想了一会儿,意识到我只需要你点击的联系人的电子邮件,所以我只是从asynctask 中删除了电子邮件代码,并创建了另一个asynctask 来加载特定联系人的电子邮件。然后我会收到被点击的联系人的电子邮件并填写电子邮件字段。代码可以在我在问题中链接到的存储库中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 2017-07-21
    • 2015-01-29
    • 2016-04-06
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多