2017-08-13 1 views
2

Je sais comment récupérer les contacts de l'appareil de l'utilisateur. Mais je me demande s'il existe un moyen d'interroger la table des contacts et d'obtenir seulement les nouveaux contacts qui ont été ajoutés?Android - Obtenez seulement les nouveaux contacts qui ont été ajoutés

Ce que je suis en train de faire est que:

Dans ma demande, j'ai lu les contacts de l'appareil et de les enregistrer dans le DB de mon application, afin que l'utilisateur peut sélectionner qui sont les favoris contact dans cette application. Et la prochaine fois que l'utilisateur entre dans l'activité de contact, j'ai lu les données de la base de données.

Maintenant, je veux ajouter un bouton d'actualisation, donc quand l'utilisateur clique dessus, la liste de contacts sera mise à jour avec les nouveaux contacts .. donc au lieu de relire toute la table de contacts .. Je veux seulement les nouveaux contacts ajoutés ou ceux qui ont été modifiés (dans l'appareil).

est-il possible d'y parvenir?

Les champs que je vois qui sont en quelque sorte liés à cette question sont « VERSION » et « DATA_VERSION »

donc je suppose que je dois enregistrer dans mon DB également la version pour chaque ligne de contact et quand l'utilisateur clique sur rafraîchir j'ai besoin de comparer cela afin de voir s'il y avait un changement .. mais dans ce cas, j'ai besoin de lire à nouveau l'ensemble des contacts de l'appareil ...

Répondre

2

Vous pouvez atteindre en utilisant ContentObserver, mais vous pouvez Ne pas obtenir quel contact mis à jour, vous pouvez obtenir seulement aviser que votre contact natif est mis à jour.

getContentResolver().registerContentObserver(
          ContactsContract.Contacts.CONTENT_URI, false, new AddressBookContentObserver()); 

    /** 
    * Content observer for Address book contacts change notification. 
    * 
    * @author malik 
    */ 
    public class AddressBookContentObserver extends ContentObserver { 
     public AddressBookContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
      if (DBG) { 
       ZKLog.d(TAG, "Contacts changes event."); 
      } 
      // We are waiting for some time, Native contact taking some time ot update, before that 
      // if we try to fetch the contact, its not returning the newly added contact 
      Timer timer = new Timer(); 

      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        // go through all the contact and check which one is missing or modified or added from your database. 
       } 
      }, 1000); 
     } 

     @Override 
     public boolean deliverSelfNotifications() { 
      return true; 
     } 
    } 

Note:

Nous ne pouvons pas où le contact est ajouté, modifié ou supprimé

+0

merci, donc il semble que j'ai encore besoin de lire toute la table, non? et puis de vérifier si j'ai le contacts_id dans ma base de données - donc cela va m'aider à trouver les nouveaux contacts .. – Elior

+0

oui, vous avez besoin de votre DB et un autre pense pas seulement vous devriez vérifier conatct_id vous devriez vérifier les numéros intérieurs aussi parce que si vous avez modifié le nombre il n'y aura pas de changement dans votre conatct_id –

+0

merci, mais au lieu de vérifier les chiffres .. Je peux également enregistrer dans mon DB le champ VERSION (chaque contact a ce champ dans la table des contacts) et quand il a été modifié - Ce champ devrait être mis à jour. de toute façon merci :) – Elior

1

A partir de niveau de l'API 18, vous pouvez utiliser Contacts.CONTACT_LAST_UPDATED_TIMESTAMP, il est donc possible d'interroger pour tous les contacts qui ont été modifiés (ou créés) récemment et comparez uniquement ceux-ci à votre dernier cache d'ID de contact, et le delta correspond aux contacts créés depuis la dernière exécution de votre code.