android
android

Reputation: 43

Android - contacts address field updating to other fields

I am trying to update the native contact data through my app. The problem is when I am updating with address, the address is updating to First name and notes and phone fields. below code is I used in my app, please correct me if any mistake.

public ArrayList<ContentProviderOperation> updateContact(Context context, ContactData contactData){
    String selectPhone = ContactsContract.Data.CONTACT_ID + "=?";
    String[] phoneArgs = new String[]{contactData.getContactLocalId()};
    ArrayList <ContentProviderOperation> ops = new ArrayList <> ();

    ops.add(ContentProviderOperation.newUpdate(
            ContactsContract.RawContacts.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
            .build());

    //------------------------------------------------------ Names
    ops.add(ContentProviderOperation.newUpdate(
            ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)

            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(
                    ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
                    contactData.getFirstName())
            .withValue(
                    ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(
                    ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
                    contactData.getLastName())

            .build());

    //------------------------------------------------------ Mobile Number
    ops.add(ContentProviderOperation.
            newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contactData.getContactPhoneBook().get(0).getNumber())
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
            .build());

    //------------------------------------------------------ Email
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, contactData.getEmailbook().get(0).getEmail())
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
            .build());

    //------------------------------------------------------ Notes
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Note.NOTE, contactData.getNotes())
            .build());

    //------------------------------------------------------ Address
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, phoneArgs)
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, contactData.getAddressbook().get(0).getStreet_line_1())
            .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.STREET)
            .build());

    // Asking the Contact provider to updating a contact
    try {
        ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

    return ops;
}

Upvotes: 0

Views: 299

Answers (1)

android
android

Reputation: 43

Finally I found answer for my problem.

 String selectPhone = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "= ?";
    String[] nameArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
    String[] mobileArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
    String[] emailArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};
    String[] notesArgs = new String[]{contactData.getContactLocalId(),  ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
    String[] addressArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};

we should pass separate arguments for updating.

public ContactData updateContact(Context context, ContactData contactData){
    String selectPhone = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "= ?";
    String[] nameArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
    String[] mobileArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
    String[] emailArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};
    String[] notesArgs = new String[]{contactData.getContactLocalId(),  ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
    String[] addressArgs = new String[]{contactData.getContactLocalId(), ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};

    ArrayList <ContentProviderOperation> ops = new ArrayList <> ();

    //------------------------------------------------------ Names
    ops.add(ContentProviderOperation.newUpdate(
            ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, nameArgs)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contactData.getFirstName())
            .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, contactData.getLastName())
            .build());

    //------------------------------------------------------ Mobile Number
    ops.add(ContentProviderOperation.
            newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, mobileArgs)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contactData.getContactPhoneBook().get(0).getNumber())
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
            .build());

    //------------------------------------------------------ Email
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, emailArgs)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, contactData.getEmailbook().get(0).getEmail())
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
            .build());

    //------------------------------------------------------ Notes
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, notesArgs)
            .withValue(ContactsContract.CommonDataKinds.Note.NOTE, contactData.getNotes())
            .build());

    //------------------------------------------------------ Address
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(selectPhone, addressArgs)
            .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, contactData.getAddressbook().get(0).getStreet_line_1())
            .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.STREET)
            .build());

    // Asking the Contact provider to updating a contact
    try {
        ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        String serverId =  markAsUpdated(contactData);
        contactData.setContactId(serverId);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

    return contactData;
}

Upvotes: 3

Related Questions