Capire l'architettura dei contatti di Android

Ciao, sto sviluppando un'applicazione Android che deve sapere quando un contatto viene aggiunto / aggiornato / eliminato.

Così ho letto diversi post per esso. Quindi le informazioni che ho raccolto sono

  • Come posso get l'allarme di ripetizione per giorni di giorni utilizzando l'allarme?
  • Porting Android x86, imansible farlo funzionare
  • Voce di menu di opzione personalizzata di Android
  • aggiungendo il proprio database SQLite ad un'applicazione android
  • Può la mia applicazione Android aprire un URL in una scheda inceachta?
  • Utilizzo di _FILES Non in grado di submit file al server PHP
  • Possiamo ricevere notifica attraverso gli osservatori di contenuti each volta che i contatti vengono cambiati. Ma non possiamo get i contatti che sono stati aggiunti / aggiornati / eliminati. Così ho letto le apis ufficiali e ho preparato il mio progetto come catturare quel particolare contatto.

    Così quello che pensavo all'inizio

    1. Memoricheremo tutti gli ID del contatto, la bandiera eliminata e la versione
    2. Ogni volta che i contatti vengono cambiati, riceverò il count delle righe e il numero di righe del mio tavolo dal sistema Android.
    3. Se il numero di righe è inferiore a quello dei conteggi dei sisthemes, un contatto è stato eliminato.
    4. Se il mio numero di righe è maggiore del numero di righe dei sisthemes, è stato aggiunto un contatto.
    5. E se questi non sono i casi, una delle versioni dei contatti è stata modificata.

    Poi ho imparato che Android non cancella il contatto se viene eliminato dall'utente, ma imposta 0 sulla bandiera eliminata. Quindi in questi casi il count delle righe sarà uguale.

    Android modifica anche l'ID row di un contatto molte volte come indicato nei documenti ufficiali. Quindi, come possiamo identificarli in modo univoco come uri di ricerca e se no allora dobbiamo mettere anche osservatore.

    Quindi voglio solo sapere quello che ho pensato è giusto o no. E nel caso in cui un contatto venga aggiunto, verrà aggiunto all'ultima row del cursore o non significa se verifico l'ultima row del database di sistema per i contatti mi darà il contatto aggiunto oppure no.

    Aiutaci a comprendere l'architettura dei contatti di Android.

  • Non è ansible aggiungere android.support.v7 al path di creazione del progetto
  • Come distriggersre l'emoji da inserire in Android EditText?
  • Spedire l'evento di touch da una vista al suo fratello WebView
  • Com.android.camera.action.CROP non è disponibile per Android bean 4.3 di gelatina?
  • Come eseguire il command terminal nell'applicazione Android?
  • Come sostituire il frammento dell'attività dal frammento stesso?
  • 2 Solutions collect form web for “Capire l'architettura dei contatti di Android”

    Lasciami spiegare quanto potevo. Fondamentalmente la tua politica sembra abbastanza buona, ma in realtà è un po 'più complessa di quanto si pensava.

    Su Android, un contatto può essere associato a diversi contatti crudi , che possono essere fornite da molti fornitori di dati, come Google, Facebook, Skype e così via. Ad esempio, se uno dei tuoi amici nei contatti locali utilizza Skype, esistono due contatti raw esistenti separatamente in ContactContracts.RawContacts , ma verranno automaticamente aggregati e visualizzati come un contatto quando si esegue query a ContactsContract.Contacts .

    Anche per questo è difficile identificare un contatto in modo univoco, perché è ansible dividere o unirti a loro in qualsiasi momento. LOOKUP_KEY non è molto utile per questo caso.

    Molte applicazioni, ad exception di Google, forniscono solo una sola sincronizzazione, vale a dire solo dal servizio ai contatti, in modo da essere in sola lettura. In questo caso, la bandiera eliminata non verrà utilizzata e viene eliminata semplicemente durante il process di sincronizzazione. Quindi non puoi semplicemente affidarvi alla bandiera.

    Anche se non c'è una buona soluzione semplice, immagino che sia molto più facile raggiungere quello che vuoi, se si osserva per un RawContacts specifico, non Contacts . Spero che questo aiuta la tua comprensione.

    Penso che la migliore pratica è monitorare each volta che un contatto è aggregato ad un altro e identificarli dal contactName, non il _ID o CONTACT_ID. Date un'occhiata a questa eventuale operazione di contatti:

    Inserire

    Un contatto non può essere creato esplicitamente. Quando viene inserito un contatto grezzo, il provider cerca innanzitutto di trovare un contatto che rappresenta la stessa persona. Se si trova, la colonna CONTACT_ID del contatto raw ottiene il _ID del contatto aggregato. Se non viene trovata nessuna corrispondenza, il provider inserisce automaticamente un nuovo contatto e mette il suo _ID nella colonna CONTACT_ID del nuovo contatto grezzo inserito.

    Aggiornare

    Solo alcune colonne di contatto sono modificabili: TIMES_CONTACTED, LAST_TIME_CONTACTED, STARRED, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL. Modificare una qualsiasi di queste colonne sul contatto inoltre le modifiche su tutti i contatti raw contingenti.

    Elimina

    Fare attenzione a eliminare i contatti! La cancellazione di un contatto aggregato elimina tutti i contatti raw contingenti. I corrispondenti adattatori di sincronizzazione noteranno le cancellazioni dei rispettivi contatti raw e li rimuoveranno dal loro archivio posteriore.

    domanda

    Se hai bisogno di leggere un contatto individuale, consideri l'utilizzo di CONTENT_LOOKUP_URI anziché CONTENT_URI. Se hai bisogno di cercare un contatto per il numero di telefono, utilizza PhoneLookup.CONTENT_FILTER_URI, ottimizzato a tal fine. Se è necessario cercare un contatto in base al nome parziale, ad esempio per produrre suggerimenti di tipo filter, utilizzare l'URI CONTENT_FILTER_URI. Se è necessario cercare un contatto di un elemento di dati come l'indirizzo e-mail, il nickname, ecc., Utilizzare una query nella tabella ContactsContract.Data. Il risultato contiene l'ID del contatto, il nome ecc.


    Il problema, però, è che potresti avere due "Phillip Morris" nella tua list di contatti che non sono la stessa persona.

    Per ulteriori informazioni, consultare questa sezione di Documentazione di classi Android

    Spero che sia d'aiuto.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.