Получить адрес и день рождения из контактов Android в одном запросе - PullRequest
0 голосов
/ 09 мая 2019

Я хочу получить идентификатор, имя, день рождения, адрес из контактов Android.Я изменил URI (ContactsContract.CommonDataKinds, ContactsContract.Contacts и т. Д.) И смог получить адрес, но затем день рождения исчез.Во всяком случае, я пытался, я не могу найти решение, чтобы получить оба сразу.

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();
}

выходной код выше:

I: contact_id, 14046
I: display_name, Magret XXXX
I: data1, XXXX-05-31
I: data1, XXXX-05-31

Поле «data1» в спискедважды, потому что START_DATE (день рождения) и FORMATTED_ADDRESS хранятся в одном и том же виртуальном столбце «data1».

Существует ли способ определения виртуальных имен столбцов в резольвере, например, эквивалентный SQL «SELECT col1 AS name1», col2 AS name2, col3, col4 ГДЕ ... "?

1 Ответ

0 голосов
/ 09 мая 2019

две проблемы: вы ограничиваете свой запрос только EVENT s и регистрируете только первую найденную в запросе строку.

Попробуйте это:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...