2017-10-17 5 views
1

J'essaie de supprimer un détail d'un contact dans android. Par exemple, un contact a un e-mail et un numéro de téléphone, disons que je veux supprimer uniquement le numéro de téléphone. Supposons que j'ai déjà l'ID du détail d'une requête précédente.Comment supprimer un détail de contact?

Mes recherches ont uniquement trouvé des sujets liés à la suppression de l'ensemble du contact, qui a déjà fonctionné pour moi. Il s'agit de supprimer un détail uniquement, c'est-à-dire de la table ContactsContract.Data.

La partie pertinente de mon code est collée ci-dessous, encore une fois l'ID est déjà connu. Le message du journal signale qu'une entrée a été supprimée avec succès, ce que j'ai attendu. Mais lorsque je passe à l'application Contacts, le détail est toujours là. Même après avoir redémarré cette application à partir de zéro. Donc, quelque chose ne semble toujours pas mis à jour correctement.

Merci pour toute aide

private void deleteDetail(ContactDetail detail) { 
    Uri detailsUri = ContactsContract.Data.CONTENT_URI; 

    String selection = ContactsContract.Data._ID + " = ?"; 
    String[] selectionArgs = { String.valueOf(detail.getID()) }; 

    int result = 0; 
    try { 
     result = mProvider.delete(detailsUri, selection, selectionArgs); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
    Log.d(LOGTAG, "deleteDetail() - id=" + detail.getID() + ", deleted "+result+" entries"); 
} 

Répondre

0

Votre code semble ok, ce qui pourrait expliquer ce phénomène est l'existence de plus d'une occurrence de ce téléphone dans les détails de ce contact.

Par exemple, si vous avez Whatsapp, Viber ou toute autre application de messagerie par téléphone, ils vont ajouter un RawContact à chaque contact qui a un numéro de téléphone avec ligne de données du numéro de téléphone en double, ainsi que d'autres détails spécifiques à l'application .

Cela peut être dû à tout RawContact joint à ce Contact qui contient le téléphone que vous essayez de supprimer.

Si vous voulez vraiment supprimer définitivement un détail, vous pouvez faire quelque chose comme ceci:

private void deleteDetail(long contactId, String phoneNumber) { 
    Uri dataUri = Data.CONTENT_URI; 

    String selection = Data.CONTACT_ID + " =? AND " + CommonDataKinds.Phone.NUMBER + " = ?"; 
    String[] selectionArgs = { String.valueOf(contactId), phoneNumber }; 

    try { 
     int result = mProvider.delete(dataUri, selection, selectionArgs); 
     Log.d(LOGTAG, "deleteDetail() - deleted: " + result + " entries"); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

Notez que cela ne téléphone exacte comparer, donc si vous avez deux téléphones enregistrés pour ce contact, avec différents formats (tirets, code pays, etc.), il ne correspondra pas à tous. Si vous ciblez Jelly Beans Android et ci-dessus, vous pouvez utiliser CommonDataKinds.Phone.NORMALIZED_NUMBER et le comparer au format E164 du numéro de téléphone demandé (voir this)

+0

Je ne crois pas que ce soit le cas ici, pour 2 raisons: a) Je cours dans un émulateur et il n'y a pas d'autres types de contact que j'utilise, il y a seulement les contacts que je crée pour ces tests, principalement par code b) semblable à votre suggestion j'ai essayé de supprimez avec le code suivant: Modification de la sélection afin qu'elle supprime * tous * les détails téléphoniques de tous les contacts Sélection de chaîne = ContactsContract.Data.MIMETYPE + "=?"; Chaîne [] selectionArgs = {ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}; –

+0

Si vous recherchez les numéros de téléphone de ce contact après les avoir supprimés, récupérez-vous à nouveau ce téléphone supprimé? – marmor

+0

étrangement - non. la base de données semble correcte du point de vue du programme. perplexe ... –