2010-06-03 5 views
0

J'essaie d'afficher le nom, le numéro de téléphone et l'adresse électronique d'un contact et de laisser l'utilisateur mettre à jour l'une des valeurs. Pour une raison quelconque, la valeur du courrier électronique est écrasée sur les trois champs lorsque mon code est exécuté. Il doit y avoir un petit problème dans la logique, mais je ne peux pas le comprendre.Mise à jour du contact provoquant l'écriture de valeurs erronées

Voici ma méthode qui met à jour l'URI des contacts.

private void updateContact() { 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, name) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name) 
      .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber) 
      .withValue(ContactsContract.Data.MIMETYPE, 
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Email.DATA, email) 
      .build()); 

    try { 
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     // Display update 
     Context ctx = getApplicationContext(); 
     CharSequence txt = "Contact Updated"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(ctx, txt, duration); 
     toast.show(); 

    } catch (Exception e) { 
     // Display warning 
     Context ctx = getApplicationContext(); 
     CharSequence txt = "Update Failed"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(ctx, txt, duration); 
     toast.show(); 

    } 
} 

Répondre

7

voir ce lien:

http://comments.gmane.org/gmane.comp.handhelds.android.devel/92848

"vous ne devriez pas spécifier le type MIME dans une déclaration de mise à jour - il n'est pas actualisable."

"Votre requête dit:" mise à jour tous lignes de données pour ce contact, définissant l'un des champs à "John" et un autre à "Abraham". Les lignes de données comprennent les numéros de téléphone, les courriels, les photos et vous-même. Ce que vous devez faire est de trouver une ligne de données spécifique que vous voulez mettre à jour et ensuite utiliser son _id dans la sélection (ou, plus communément, dans l'URI lui-même). "

" La structure de données pour les contacts est basée sur trois tables séparées: Contacts, RawContacts et Data. Un contact peut avoir plusieurs RawContacts, qui peuvent avoir plusieurs lignes de données. Chaque ligne de données a un type mime qui spécifie quel type de données est stocké dans cette ligne. Le nom du contact est stocké dans une ligne avec le type mime StructuredName.CONTENT_TYPE. Par conséquent, pour changer le nom du contact, vous devez d'abord rechercher la ligne de données contenant le nom, puis mettre à jour cette ligne de données. Le fournisseur prendra soin du reste (par exemple la promotion du nom au niveau de RawContact puis Contact) «

Questions connexes