Search code examples
androidsqliteandroid-contentproviderandroid-contactscontactscontract

Best way to access all the details of android contacts


I am writing an application to sync contact details with my server. For this I need to query Contacts using content provider multiple times as all the data is not present in one table. For example by using contact id, I have to query separately to phone, email and address tables for each contact which I feel is not much efficient. It would be really helpful if someone could point me out ways to get all the contact details in a single query. Thanks in advance :)


Solution

  • If you have the rawContactId you don't need multiple query. You can have a single query with Data.CONTENT_URI as uri and with a selection on your rawContactId.

    The you have to loop with the resulting cursor to read the info. To know in wich column you need to see for a given row in the Data table you need to check the MIMETYPE

    EDIT

    private interface DataQuery {
        public static final String[] PROJECTION = new String[] { Data._ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3, };
    
        public static final int COLUMN_ID = 0;
        public static final int COLUMN_MIMETYPE = 1;
        public static final int COLUMN_DATA1 = 2;
        public static final int COLUMN_DATA2 = 3;
        public static final int COLUMN_DATA3 = 4;
        public static final int COLUMN_PHONE_NUMBER = COLUMN_DATA1;
        public static final int COLUMN_PHONE_TYPE = COLUMN_DATA2;
        public static final int COLUMN_GIVEN_NAME = COLUMN_DATA2;
        public static final int COLUMN_FAMILY_NAME = COLUMN_DATA3;
    
        public static final String SELECTION = Data.RAW_CONTACT_ID + "=?";
    }
    
    
    final Cursor c = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] { String.valueOf(rawContactId) }, null);
    
    try {
        while (c.moveToNext()) {
            final long id = c.getLong(DataQuery.COLUMN_ID);
            final String mimeType = c.getString(DataQuery.COLUMN_MIMETYPE);
            uri = ContentUris.withAppendedId(Data.CONTENT_URI, id);
    
            if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) {
                final String oldLastName = c.getString(DataQuery.COLUMN_FAMILY_NAME);
                final String oldFirstName = c.getString(DataQuery.COLUMN_GIVEN_NAME);
                //store them where you need
            } else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) {
                final int type = c.getInt(DataQuery.COLUMN_PHONE_TYPE);
                final String cellPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBEIR);
                //store them where you need
                }
            }
        } // while
    } finally {
        if (c!=null) c.close();
    }
    

    Please consider that I did not check the code: I do not have a compiler here. I hope it will be useful anyway