2012-01-09 15 views
18

Próbuję wstawić i zaktualizować informacje na temat kontaktu istniejącego, dlatego utworzyłem przykładową aplikację, aby rozwinąć funkcjonalność. Chcę tylko, aby moja przykładowa aplikacja wstawiała (lub jeśli jest obecna) aktualizuje adres e-mail kontaktu.Modyfikowanie informacji kontaktowych

Ja wybierając kontakt poprzez intencyjny systemu tak:

startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST); 

URI, który jest zwracany jest to, że z Contact który został wybrany i jest w tej formie (RawContact): content://com.android.contacts/contacts/lookup/0r2-2A90214945/2.

mogę wycofać wszystkie Data (RawContact?) Pozycji na ten wykonując następujący kod:

Cursor cursor = contentResolver.query(mContactUri, null, null, null, null); 
try { 
    if (cursor.moveToFirst()) { 
     for(int i=0; i < cursor.getColumnCount(); i++) { 
      String message = cursor.getColumnName(i); 
      Log.v("", message); 
     } 
    } 
} finally { 
    cursor.close(); 
} 

Od tego powinienem być w stanie określić, czy kontakt ma już CommonDataTypes.EmailData uczestnika:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1; 

a następnie wykonaj jedną z następujących czynności albo Insert lub UpdateData:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

ops.add(ContentProviderOperation.newInsert(mContactUri) 
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) 
    .withValue(Email.DISPLAY_NAME, "[email protected]") 
    .withValue(Email.TYPE, Email.TYPE_HOME) 
    .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Ale to daje mi wyjątek: java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

Mam nadzieję, że ktoś może zobaczyć, co Tęskniłam.

PS używam tych uprawnień:

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
+0

ok, usunę go. dzięki –

Odpowiedz

43

Android ludzie muszą aktualizować swoją documentation. Faktycznie służyło mi to, aby wiedzieć, co się dzieje, niż bym się domyślał. Sugeruje, że możesz wycofać Contact, który będzie zawierać wiele RawContacts, które będą zawierać Data.

Ta interpretacja jest całkowicie błędna. Dane ContactContracts jest natomiast trzy średnie normalne codzienne tabele bazy danych *:

ContactContract Stoły

Tabela: Contacts

Dostęp URI: Contacts.CONTENT_URI

klucz podstawowy **: Data._ID

Opis:

Ta tabela zawiera informacje o kontakcie (kiedy został dodany, co to jest ikona użytkownika, czy ma niestandardowy dzwonek).

Relacje: Ma związek jeden do wielu ze stołem RawContact.

Tabela: RawContacts

Dostęp URI: RawContacts.CONTENT_URI

Klucz główny: Data._ID

klucz obcy **: Data.CONTACT_ID

Opis:

Ta tabela zawiera informacje o powiązanym zestawie elementów danych. RawContact może zawierać typ adresu e-mail, wyświetlaną nazwę e-mail, numer telefonu, wyświetlaną nazwę telefonu itp. RawContact może być agregowany z innymi RawContacts, aby uzyskać Contact, gdy użytkownik to zobaczy. Kontakt może zawierać tylko jeden RawContact.

Relacja: Ma związek jeden do wielu ze stołem Data.

Tabela: Data

Dostęp URI: Data.CONTENT_URI

Klucz główny: Data._ID

Klucz obcy: Data.RAW_CONTACT_ID

Opis:

Ta tabela zawiera pojedyncze pole informacji. Adres e-mail, numer telefonu, typ numeru telefonu (dom/praca), pseudonim, wyświetlana nazwa.

W odpowiedzi na pytanie

I przesłaniu całego projektu próbki do GitHub, aby pozwolić innym zobaczyć, jak kwerendy, aktualizacja i wstawić rekordów przy użyciu ContactContract.

można znaleźć projekt, aby pobrać tutaj: https://github.com/gwoodhouse/ContactContractSample

Jeśli chcesz tylko spojrzeć na kod java wykonywania zapytań/aktualizacji/wstawić tutaj jest plik klasy: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

Nadzieja ta pomaga!

* Nie stół, ale ContentProvider

** nie ściśle prawda.

+0

Cytując swoje oświadczenie: "Kontakt może zawierać tylko jeden RawContact" ... Myślę, że kontakt jest połączeniem wielu RawContacts. Popraw mnie, jeśli się mylę. –

+0

(Minęło trochę czasu, ale) Myślę, że "Kontakt" może zawierać tylko pojedynczy "RawContact" i nadal jest ważny. – Graeme

+1

Tak, ale nadal będzie ważne, jeśli zawiera wiele RawContacts. Dzięki za projekt. –

Powiązane problemy