首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在一次查询中获取android联系人的地址和生日

在一次查询中获取android联系人的地址和生日
EN

Stack Overflow用户
提问于 2019-05-09 17:00:31
回答 1查看 104关注 0票数 0

我想从android联系人中获取id,姓名,生日,地址。我更改了uri (ContactsContract.CommonDataKinds、ContactsContract.Contacts等)。能拿到地址但是生日就消失了。无论我如何尝试,我都找不到一种解决方案来同时获取这两个。

代码语言:javascript
复制
public void getBirthdays() {

    // get data from contacts
    Uri uri = ContactsContract.Data.CONTENT_URI;

    String[] projection = new String[]{
            ContactsContract.CommonDataKinds.Event.CONTACT_ID,
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Event.START_DATE,
            ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS};

    String selection =
            ContactsContract.Data.MIMETYPE + "= ? AND " +
                    ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;

    String[] selectionArgs = new String[]{ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};

    Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);
    int columnCount = cursor.getColumnCount();
    cursor.moveToFirst();
    for (int i = 0; i < columnCount; i++) {
        Common.echo(cursor.getColumnName(i) + ", " + cursor.getString(i));
    }
    cursor.close();
}

上述代码的输出为:

代码语言:javascript
复制
I: contact_id, 14046
I: display_name, Magret XXXX
I: data1, XXXX-05-31
I: data1, XXXX-05-31

"data1"-field被列出两次,因为START_DATE (生日)和FORMATTED_ADDRESS都存储在同一个虚拟列"data1“中。

有没有一种方法可以在解析程序中定义虚拟列名,比如"SELECT col1 AS name1,col2 AS name2,col3,col4 WHERE..."?

EN

回答 1

Stack Overflow用户

发布于 2019-05-10 03:45:19

有两个问题:您将查询限制在EVENT中&您只记录在查询中找到的第一行。

试试这个:

代码语言:javascript
复制
private class Contact {
    public Long contactId;
    public String name;
    public String birthday;
    public String address;
}

public void getBirthdaysAndAddress() {

    // mapping from contactId to a contact object 
    Map<Long, Contact> contacts = new HashMap<>();

    Uri uri = Data.CONTENT_URI;

    String[] projection = new String[]{
            Data.CONTACT_ID,
            Data.DISPLAY_NAME,
            Data.MIMETYPE,
            Data.DATA1,
            Event.TYPE};

    // get ALL rows that represent either a birthday or a postal address
    String selection = Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?";
    String[] selectionArgs = new String[]{Event.CONTENT_ITEM_TYPE, StructuredPostal.CONTENT_ITEM_TYPE};

    Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);

    while (cursor.moveToNext()) {
        Long id = cursor.getLong(0);

        // get an existing contact object, or create a new one
        Contact contact = contacts.get(id);
        if (contact == null) {
            contact = new Contact();
            contact.contactId = id;
            contact.name = cursor.getString(1);
            contacts.put(id, contact);
        }

        String mimetype = cursor.getString(2);
        if (mimetype.equals(Event.CONTENT_ITEM_TYPE)) {
            // this is an event row, check that it is a birthday
            int type = cursor.getInt(4);
            if (type == Event.TYPE_BIRTHDAY) {
                contact.birthday = cursor.getString(3);
            }
        } else {
            // this is an address row
            contact.address = cursor.getString(3);
        }
    }
    cursor.close();

    // print all contact objects containing a birthday
    Iterator it = mp.values().iterator();
    while (it.hasNext()) {
        Contact contact = (Contact) it.next();
        if (!TextUtils.isEmpty(contact.birthday)) {
            Log.i("Birthday contacts", contact.contactId + " - " + contact.name + " - " + contact.birthday + " - " + contact.address);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56055824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档