testivanivan
testivanivan

Reputation: 1514

Android Content provider. How to get all data by one request from contact book

Is it possible to retrieve all data from contact book by one request (phone number, email, first name, last name, photo, thumbnail). Right now I am running a separate request for a first and last name, a separate request for a phone number and a separate request for an email, and so on. Is it possible to get all this data in one request? Please help me.

Upvotes: 1

Views: 584

Answers (1)

marmor
marmor

Reputation: 28179

Yes, you can.

You're probably running your queries on Alias tables such as CommonDataKinds.Phone and CommonDataKinds.Email, but the actual data for all these tables is stored in a single table called Data.

So you should query directly on Data and use the MIMETYPE column to figure out the "type" of the current row you're iterating over.

Here's an example of getting name, email, phone. You can add more mimetypes to the list to get more types of data. I'm using a HashMap to keep a list of values for each contact-ID but you would probably want to create a custom Contact class and put that info in it.

Map<Long, List<String>> contacts = new HashMap<Long, List<String>>();

String[] projection = {Data.CONTACT_ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3};

// query only name/emails/phones
String selection = Data.MIMETYPE + " IN ('" + StructuredName.CONTENT_ITEM_TYPE + "', '" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0);
    String mime = cur.getString(1); // type of data (name / phone / email)
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

    String kind = "unknown";

    switch (mime) {
        case Phone.CONTENT_ITEM_TYPE: 
            kind = "phone"; 
            break;
        case StructuredName.CONTENT_ITEM_TYPE: 
            kind = "name";
            break;
        case Email.CONTENT_ITEM_TYPE: 
            kind = "email";
            break;
    }
    Log.d(TAG, "got " + id + ", " + kind + " - " + data);

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    List<String> infos;
    if (contacts.containsKey(id)) {
        infos = contacts.get(id);
    } else {
        infos = new ArrayList<String>();
        contacts.put(id, infos);
    }
    infos.add(kind + " = " + data);
}

Upvotes: 1

Related Questions