2012-01-09 17 views
18

Sto tentando di inserire e aggiornare un'informazione su un contatto esistente, quindi ho creato un'applicazione di esempio per sviluppare la funzionalità. Tutto quello che voglio è la mia app di esempio da inserire (o se presente) aggiornare un indirizzo email su un contatto.Modifica informazioni di contatto

che sto selezionando un contatto attraverso il sistema di intenti in questo modo:

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

L'URI che viene restituito è quello del Contact che è stato selezionato ed è disponibile in questa forma (RawContact?): content://com.android.contacts/contacts/lookup/0r2-2A90214945/2.

posso tirare indietro tutti gli elementi Data (RawContact?) Su questo eseguendo il seguente codice:

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(); 
} 

Da questo dovrei essere in grado di determinare se il contatto ha già un membro CommonDataTypes.EmailData:

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

e quindi eseguire una delle seguenti a uno o InsertUpdate il Data:

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); 

Ma questo mi dà un'eccezione: java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

Speriamo che qualcuno può vedere quello che ho perso.

PS, sto usando queste autorizzazioni:

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

ok, lo rimuoverò. grazie –

risposta

43

Il popolo Android hanno bisogno di aggiornare il loro documentation. In realtà mi è servito per farmi sapere in meno di su quello che stava succedendo di quanto avrei ricavato dalla supposizione. Suggerisce di poter ritirare uno Contact, che conterrà molti RawContacts che conterrà Data.

Questa interpretazione è completamente sbagliata. ContactContracts dati è invece di tre medi normali tabelle di database di tutti i giorni *:

Tabelle ContactContract

Tabella: Contacts

Accesso URI: Contacts.CONTENT_URI

Chiave primaria **: Data._ID

Descrizione:

Questa tabella contiene informazioni su un contatto (quando è stato aggiunto, che cos'è un'icona utente, ha una suoneria personalizzata).

Relazione: ha una relazione 1-a-molti con la tabella RawContact.

Tabella: RawContacts

Accesso URI: RawContacts.CONTENT_URI

Chiave primaria: Data._ID

chiave esterna **: Data.CONTACT_ID

Descrizione:

Questa tabella contiene informazioni su un set correlato di elementi dati. Un RawContact può contenere il tipo di email, il nome visualizzato per e-mail, il numero di telefono, il nome visualizzato del telefono, ecc. Un RawContact può essere aggregato con altri RawContacts per creare un Contact come utente. Un contatto può contenere solo un RawContact.

Relazione: ha una relazione 1-a-molti con la tabella Data.

Tabella: Data

Accesso URI: Data.CONTENT_URI

Chiave primaria: Data._ID

Chiave esterna: Data.RAW_CONTACT_ID

Descrizione:

Questa tabella contiene un singolo campo di informazioni. Un indirizzo e-mail, un numero di telefono, un tipo di numero di telefono (casa/lavoro), un soprannome, un nome visualizzato.

In risposta alla domanda

Ho caricato l'intero progetto di esempio per GitHub, al fine di permettere agli altri di vedere come interrogare, aggiornare e inserire annotazioni utilizzando ContactContract.

Potete trovare il progetto per scaricare qui: https://github.com/gwoodhouse/ContactContractSample

Se si desidera solo guardare il codice Java di eseguire la query/aggiornamento/inserimento Ecco il file di classe: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

Spero che questo aiuta!

* Non un tavolo, ma un ContentProvider

** non strettamente vero.

+0

Citando la tua affermazione: "Un contatto potrebbe contenere solo un RawContact" ... Penso che un contatto sia una combinazione di molti RawContacts. Correggimi se sbaglio –

+0

(È passato un po 'di tempo). Penso che un 'Contact' possa contenere solo un singolo' RawContact' e sia comunque valido. – Graeme

+1

Sì, ma sarà comunque valido se contiene molti RawContacts. Grazie per il progetto però. –

Problemi correlati