在来自 ContactProvider 的单个查询中获取联系人列表及其主要电子邮件和电话号码

Posted

技术标签:

【中文标题】在来自 ContactProvider 的单个查询中获取联系人列表及其主要电子邮件和电话号码【英文标题】:Fetch contact list along with their primary email and phone number in a single query from the ContactProvider 【发布时间】:2013-09-10 04:17:20 【问题描述】:

我正在尝试获取联系人列表以及他们的电话和电子邮件详细信息,以将它们显示在列表中。我现在所做的是做三个单独的查询。

    从 Contacts.CONTENT_URI 获取到 contactCursor 的联系人列表 从 Phone.CONTENT_ITEM_TYPE 获取所有电话号码到 phoneCursor 从 Email.CONTENT_ITEM_TYPE 获取所有电子邮件到 emailCursor

然后我将循环通过contactCursor。对于每个联系人,我将遍历 phoneCursor 和 emailCursor 以获取主要电话号码和电子邮件。但这需要一些时间来加载,并且在联系人数量很大时清晰可见。有什么方法可以让我在第一步中获得所有这些细节。

下面是sn-p的代码:

    Cursor contacts = resolver.query(Contacts.CONTENT_URI, 
            CONTACT_PROJECTION, Contacts.HAS_PHONE_NUMBER + " != 0", null, Contacts._ID + " ASC");
    Cursor phone = resolver.query(Data.CONTENT_URI, PHONE_PROJECTION, 
            Data.MIMETYPE + "=? ", 
            new String[]Phone.CONTENT_ITEM_TYPE, 
            Data.CONTACT_ID + " ASC");

    Cursor email = resolver.query(Data.CONTENT_URI, EMAIL_PROJECTION, 
            Data.MIMETYPE + "=? ", 
            new String[]Email.CONTENT_ITEM_TYPE, 
            Data.CONTACT_ID + " ASC");

    if (contacts!=null && contacts.moveToFirst()) 
        do 

            String contactId = contacts.getString(0);

            if(phone!=null && phone.moveToFirst())
                do
                    if(contactId.equalsIgnoreCase(phone.getString(0)))
                        contact.setMobile(phone.getString(1));

                        break;
                    
                while(phone.moveToNext());
            

            if(email!=null && email.moveToFirst())
                do
                    if(contactId.equalsIgnoreCase(email.getString(2)))
                        contact.setEmailWork(email.getString(1));
                        break;
                    
                while(email.moveToNext());
            



         while (contacts.moveToNext());

【问题讨论】:

【参考方案1】:

以下是获取所有联系人(包括电子邮件)的代码。

private void getContacts() 
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        String id = null, name = null, email = null, phone = null, note = null, orgName = null, title = null;
        String Phone1 = "unknown", Phone2 = "unknown", Phone3 = "unknown", type1 = "unknown", type2 = "unknown", type3 = "unknown";
        int size = cur.getCount();
        StringBuilder addbuffer = null;
        if (cur.getCount() > 0) 
            int cnt = 1;
            while (cur.moveToNext()) 
                email = "";
                name = "";
                cnt++;
                id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                if (name != null && name != "") 
                    // if (!checkEmail(name)) 
                    // email = "";
                    //
                    //  else 
                    email = name;
                    name = "";
                    // 
                
                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                    System.out.println("name : " + name);
                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                            new String[]  id , null);

                    Phone1 = " ";
                    Phone2 = " ";
                    Phone3 = " ";
                    while (pCur.moveToNext()) 
                        String phonetype = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                        String MainNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        if (phonetype.equalsIgnoreCase("1")) 
                            Phone1 = MainNumber;
                            type1 = "home";
                         else if (phonetype.equalsIgnoreCase("2")) 
                            Phone2 = MainNumber;
                            type2 = "mobile";
                         else 
                            Phone3 = MainNumber;
                            type3 = "work";
                        
                    
                    pCur.close();

                
                Cursor addrCur = cr.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, null, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID
                        + " = ?", new String[]  id , null);
                if (addrCur.getCount() == 0) 

                    addbuffer.append("unknown");
                 else 
                    int cntr = 0;
                    while (addrCur.moveToNext()) 

                        cntr++;
                        String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
                        if (poBox == null) 
                            poBox = " ";
                        
                        String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
                        if (street == null) 
                            street = " ";
                        
                        String neb = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.NEIGHBORHOOD));
                        if (neb == null) 
                            neb = " ";
                        
                        String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
                        if (city == null) 
                            city = " ";
                        
                        String state = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
                        if (state == null) 
                            state = " ";
                        
                        String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
                        if (postalCode == null) 
                            postalCode = " ";
                        
                        String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
                        if (country == null) 
                            country = " ";
                        

                        String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
                        if (type == null) 
                            type = " ";
                        
                    

                

                addrCur.close();

                String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                String[] noteWhereParams = new String[]  id, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE ;
                Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null);

                note = " ";

                if (noteCur.moveToFirst()) 
                    note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));

                    if (note == null) 
                        note = " ";
                    
                
                noteCur.close();
                String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                String[] orgWhereParams = new String[]  id, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE ;
                Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, null, orgWhere, orgWhereParams, null);
                orgName = " ";
                if (orgCur.moveToFirst()) 
                    orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY));

                
                if (orgName == null) 
                    orgName = " ";
                
                orgCur.close();

                Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                        new String[]  id , null);
                email = "unknown";
                while (emailCur.moveToNext()) 

                    email = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                    String emailType = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));

                    if (email == null) 
                        email = "unknown";
                    
                    if (emailType.equalsIgnoreCase("1")) 
                     else 
                    
                
                // add
                emailCur.close();
            
        
    

【讨论】:

这涉及到多个查询。我想在一个查询中获取所有详细信息。您的代码将需要对“n”个联系人进行 1 + (n x 2) 次查询。 我也想要同样的,但这可能是不可能的:(

以上是关于在来自 ContactProvider 的单个查询中获取联系人列表及其主要电子邮件和电话号码的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中打印来自 db2 查询的单个结果

在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

带有 Repository/Firestore 的 MVVM - 存储来自单个集合的不同查询数组的最佳位置在哪里?

C# 使用单个按钮运行 3 个 MYSQL 插入查询 - 来自文本框和列表视图的数据

通过将单个查询图像与多个图像的列表匹配来存储关键点索引