2013-04-04 17 views
17

Witam Pracuję nad aplikacją na Androida, która musi wiedzieć, kiedy kontakt zostanie dodany/zaktualizowany/usunięty.Zrozumienie architektury kontaktów Androida

Dlatego przeczytałem kilka postów na ten temat. Tak więc informacje, które zebrałem, to:

Możemy otrzymywać powiadomienia za pośrednictwem obserwatorów treści za każdym razem, gdy kontakty się zmieniają. Ale nie możemy uzyskać informacji, które kontakty zostały dodane/zaktualizowane/usunięte. Więc przeczytałem oficjalną apis i przygotowałem projekt, jak uchwycić ten konkretny kontakt.

Więc co ja thinked na początku

  1. Będziemy przechowywać wszystkie identyfikatory kontaktowe, usunięte flagę i wersję
  2. Ilekroć kontakty przebrać dostanę mojego stolika Policzmy rząd i rząd liczyć z systemem Android.
  3. Jeśli mój rząd wierszy jest mniejszy niż liczba wierszy systemu, to kontakt został usunięty.
  4. Jeśli mój rząd wierszy jest większy niż liczba wierszy systemu, to dodany został kontakt.
  5. A jeśli nie są to przypadki, to jedna z wersji kontaktów została zmieniona.

Potem dowiedziałem się, że Android nie usuwa kontaktu, jeśli został usunięty przez użytkownika, ale ustawia 0 na usuniętej flagi. W takich przypadkach liczba wierszy będzie taka sama.

Android wielokrotnie zmienia identyfikator wiersza kontaktu zgodnie z oficjalnymi dokumentami. W jaki więc sposób możemy je jednoznacznie identyfikować, tak jak szukają uri, a jeśli nie, to musimy również postawić na to obserwatora.

Po prostu chcę wiedzieć, co uważałem za poprawne, czy nie. A w przypadku, gdy kontakt zostanie dodany, zostanie dodany do ostatniego wiersza kursora, lub nie oznacza, że ​​jeśli sprawdzę ostatni wiersz bazy danych systemu dla kontaktów, otrzymam kontakt dodany lub nie.

Proszę, pomóżcie mi zrozumieć architekturę kontaktów Androida.

+0

Brzmi jak duplikat [how-to-listen-for-changes-in-contact-database] (http://stackoverflow.com/questions/1401280/how-to-listen-for-changes-in- contact-database) – paulsm4

+0

@ paulsm4 Drogi Panie, moje pytanie jest podejściem do kontynuowania moich badań w celu zrozumienia modelu zarządzania kontaktami androidów. Nie ma żadnego związku z żadnym innym pytaniem. –

+0

@leonfloy dzięki za poprawienie mojego tytułu. –

Odpowiedz

13

Pozwól mi wyjaśnić tyle, ile mogłem. Zasadniczo twoja polityka wygląda całkiem nieźle, ale w rzeczywistości jest nieco bardziej skomplikowana, niż ci się wydawało.

Na Androidzie, kontakt może być powiązany z kilkoma raw contacts, które mogą być dostarczane przez wielu dostawców danych, takich jak Google, Facebook, Skype i tak dalej. Jeśli na przykład jeden z Twoich znajomych w Twoich lokalnych kontaktach korzysta również ze Skype'a, istnieją dwa nieprzetworzone kontakty, które są osobno dostępne w ContactContracts.RawContacts, ale zostaną zsumowane automatycznie i pojawią się jako jeden kontakt, gdy zapytasz o numer ContactsContract.Contacts.

Z tego powodu trudno jest zidentyfikować kontakt w wyjątkowy sposób, ponieważ you can split or join them w dowolnym momencie. LOOKUP_KEY nie jest bardzo przydatny w tym przypadku.

Wiele aplikacji, z wyjątkiem Google, zapewnia tylko jednokierunkową synchronizację, , tj. tylko z usługi do kontaktów, więc są one tylko do odczytu. W takim przypadku usunięta flaga nie zostanie użyta i po prostu usunięta podczas procesu synchronizacji. Dlatego nie można po prostu polegać na flagach.

Chociaż nie ma dobrego prostego rozwiązania, myślę, że o wiele łatwiej jest osiągnąć to, co chcesz, jeśli obserwujesz dla określonego RawContacts, a nie Contacts. Mam nadzieję, że to pomoże ci zrozumieć.

+0

ładne wyjaśnienie. Dziękujemy +1 za Ciebie. –

8

Uważam, że najlepszą praktyką jest monitorowanie, gdy kontakt ma łączność z innym i identyfikowanie ich przez nazwę kontaktu, a nie identyfikator _ID lub ID_KONTAKTU. Spójrz na tego ewentualnie kontaktów operacji:

Włóż

kontaktu nie mogą być tworzone w sposób jawny. Po wstawieniu nieprzetworzonego kontaktu dostawca najpierw spróbuje znaleźć kontakt reprezentujący tę samą osobę. Jeśli zostanie znaleziony, kolumna CONTACT_ID kontaktu surowego otrzymuje identyfikator _ID zagregowanego kontaktu. Jeśli nie zostanie znalezione dopasowanie, dostawca automatycznie wstawia nowy kontakt i umieszcza swój identyfikator _ID w kolumnie CONTACT_ID nowo wstawionego nieprzetworzonego kontaktu.

Aktualizacja

tylko niektóre kolumny kontaktowe są modyfikowalne: TIMES_CONTACTED, LAST_TIME_CONTACTED, zagrała, CUSTOM_RINGTONE, SEND_TO_VOICEMAIL. Zmiana dowolnej z tych kolumn w Kontaktie powoduje również ich zmianę we wszystkich nieodłącznych elementach składowych.

Usuń

Uważaj Usuwanie kontaktów! Usunięcie zagregowanego kontaktu powoduje skasowanie wszystkich nieprzetworzonych kontaktów składowych. Odpowiadające im adaptery synchronizacji zauważą usunięcie ich odpowiednich nieprzetworzonych kontaktów i usuwają je z zaplecza.

Zapytanie

Jeśli trzeba czytać indywidualny kontakt, należy rozważyć użycie CONTENT_LOOKUP_URI zamiast CONTENT_URI. Jeśli chcesz wyszukać kontakt za pomocą numeru telefonu, użyj funkcji PhoneLookup.CONTENT_FILTER_URI, która jest zoptymalizowana do tego celu. Jeśli chcesz wyszukać kontakt po częściowej nazwie, np. Aby utworzyć sugestie typu filtru według własnego uznania, użyj identyfikatora URI CONTENT_FILTER_URI. Jeśli chcesz wyszukać kontakt za pomocą jakiegoś elementu danych, takiego jak adres e-mail, pseudonim itp., Użyj zapytania w tabeli ContactsContract.Data. Wynik będzie zawierać kontakt ID, nazwa itp


Problemem jest jednak to, że można mieć dwie „Phillip Morris” w swojej liście kontaktów, które nie są tą samą osobą.

W celu uzyskania dalszych informacji, patrz this section Android klasy Dokumentacji

Nadzieję, że to pomaga.

+0

Niezłe wyjaśnienie. +1 dla ciebie. –

+1

twoje odpowiedzi pokazują więcej wysiłków badawczych w korespondencji z pytaniem. Przyznam ci tę nagrodę. Dzięki. Ale jeśli znajdziesz więcej informacji, dodaj go tutaj. –

+0

Cieszę się, że pomogę @Nikhil. – Christian