Pectus Excavatum
Pectus Excavatum

Reputation: 3783

Android (Xamarin) Updating a Contact

I am having a bit of trouble updating a contact - yesterday I managed to change all my contact details on my test phone to "0 Main" :-(

I am able to creat e brand new contact just fine using the following code:

if (_IsNewContact)
        {
            List<ContentProviderOperation> ops = new List<ContentProviderOperation>();

            ContentProviderOperation.Builder builder =
                ContentProviderOperation.NewInsert(ContactsContract.RawContacts.ContentUri);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountType, null);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountName, null);
            ops.Add(builder.Build());

            //Name
            builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.StructuredName.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, _Contact.FirstName);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName, _Contact.LastName);
            ops.Add(builder.Build());

            //Number
            builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.Phone.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, _Contact.Phone);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,
                              ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Label, "Main");
            ops.Add(builder.Build());

            //Email
            builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.Email.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data, _Contact.Email);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Type,
                              ContactsContract.CommonDataKinds.Email.InterfaceConsts.TypeCustom);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Label, "Main");
            ops.Add(builder.Build());

            //Add the new contact
            ContentProviderResult[] result;

            try
            {
                result = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
            }
            catch { }
        }

And here is the code I use to update, but at the moment it tries to change every single contact changing all the values to 0 Main

else
        {
            List<ContentProviderOperation> ops = new List<ContentProviderOperation>();

            ContentProviderOperation.Builder builder =
                ContentProviderOperation.NewUpdate(ContactsContract.RawContacts.ContentUri);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountType, null);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountName, null);
            ops.Add(builder.Build());

            //Name
            builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.StructuredName.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, _Contact.FirstName);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName, _Contact.LastName);
            ops.Add(builder.Build());

            //Number
            builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.Phone.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, _Contact.Phone);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,
                              ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Label, "Main");
            ops.Add(builder.Build());

            //Email
            builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.Email.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data, _Contact.Email);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Type,
                              ContactsContract.CommonDataKinds.Email.InterfaceConsts.TypeCustom);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Label, "Main");
            ops.Add(builder.Build());

            //Add the new contact
            ContentProviderResult[] result;

            try
            {
                result = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
            }
            catch { }
        }

Upvotes: 0

Views: 523

Answers (1)

CalCof
CalCof

Reputation: 46

The code below will allow you to update a contact using Xamarin native android.

            // Name 
            String nameSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND " 
                                   + ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
            String[] nameSelectionArgs = {
                _Contact.DataId.ToString(),
                ContactsContract.CommonDataKinds.StructuredName.ContentItemType
            };

            ContentProviderOperation.Builder builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithSelection(nameSelection, nameSelectionArgs);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, _Contact.FirstName);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName, _Contact.LastName);
            ops.Add(builder.Build());

            // Phone
            String phoneSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND " 
                                    + ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
            String[] phoneelectionArgs = {
                _Contact.DataId.ToString(),
                ContactsContract.CommonDataKinds.Phone.ContentItemType
            };

            builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithSelection(phoneSelection, phoneelectionArgs);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, _Contact.Phone);
            ops.Add(builder.Build());

            // Email
            String emailSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND "
                             + ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
            String[] emailSelectionArgs = {
                _Contact.DataId.ToString(),
                ContactsContract.CommonDataKinds.Email.ContentItemType
            };

            builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
            builder.WithSelection(emailSelection, emailSelectionArgs);
            builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data, _Contact.Email);
            ops.Add(builder.Build());

            // Update the contact
            ContentProviderResult[] result;
            try
            {
                result = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
            }
            catch { }

Upvotes: 3

Related Questions