2011-12-13 24 views
16

Ho un contatto esistente, ho bisogno di aggiungere un indirizzo di lavoro a quel contatto esistente. Sto usando il seguente codice, ma non funziona.Come aggiornare il contatto esistente?

String selectPhone = Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "='" + 
    ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + 
    "'" + " AND " + ContactsContract.CommonDataKinds.StructuredPostal.TYPE + "=?"; 
String[] phoneArgs = new String[] 
    {String.valueOf(ContactId), String.valueOf(
    ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)}; 
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
    .withSelection(selectPhone, phoneArgs) 
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET) 
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY) 
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION) 
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE) 
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, COUNTRY) 
    .build()); 
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Qualsiasi soluzione per questo?

+0

Sto vivendo lo stesso problema senza alcun risultato, nessun aiuto a nessuno? – user788511

+0

qualcuno per favore aiuto ?? – user788511

risposta

0

Forse si potrebbe usare Intent and its ACTION_EDIT per ottenere il vostro utente Modificare l'indirizzo di lavoro ...

+0

Questo non è l'ideale, l'ho provato prima ma non soddisfa i requisiti della mia applicazione. – user788511

1

finalmente ho trovato le appropriate grazie a questa solution..Much How to modify existing Contact

Il segreto è che devi passare due valori per .withSelection riportati di seguito:

.withSelection(Data.RAW_CONTACT_ID + " = ?", new String[] {String.valueOf(id)}) 
.withSelection(Data._ID + " = ?", new String[] {mDataId}) 

dove per Data._ID valore mDataId si ottiene in questo modo:

Cursor mDataCursor = this.context.getContentResolver().query(
         Data.CONTENT_URI, 
         null, 
         Data.RAW_CONTACT_ID + " = ? AND " + Data.MIMETYPE + " = ?", 
         new String[] { String.valueOf(id), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}, 
         null); 

       if(mDataCursor.getCount() > 0) { 
        mDataCursor.moveToFirst(); 
        mDataId = getCursorString(mDataCursor, Data._ID); 
        MLog.v("Data", "Found data item with MIMETYPE");        
        mDataCursor.close(); 

       } else { 
        MLog.v("Data", "Data doesn't contain MIMETYPE"); 
        result = ERROR; 
        mDataCursor.close(); 
       } 

e il metodo getCursorString è qualcosa di simile:

private static String getCursorString(Cursor cursor, String columnName) { 
     int index = cursor.getColumnIndex(columnName); 
     if(index != -1) return cursor.getString(index); 
     return null; 
    } 

Questo e solo questo è il trucco ..

1

Ogni campo (e-mail, nome, adreess) ha il suo tipo MIME, che si dovrebbe usare per aggiornare il campo.

Lavoreremo con la tabella Dati, dove ogni Data.RAW_CONTACT_ID rappresenta un dettaglio su alcuni contatti.

Quindi, dobbiamo trovare Data.RAW_CONTACT_ID dove ID è l'ID del contatto che si desidera modificare.

Spero che questo codice possa esserti utile.

String selectPhone = Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "='" + 
         ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + "'" ; 
        String[] phoneArgs = new String[]{String.valueOf(rawContactId)}; 
        ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
         .withSelection(selectPhone, phoneArgs) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE) 
         .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, POSTCODE) 
         .build()); 
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Se si è creato un nuovo contatto, ma senza indirizzo, e ora si vuole aggiungere un indirizzo che contcat. In questo caso usa la stessa query come sopra, ma cambia semplicemente newUpdate su newInsert, dal momento che tale riga non esiste ancora.

13
 /** 
      * @param name name of the contact 
      * @param number mobile phone number of contact 
      * @param email work email address of contact 
      * @param ContactId id of the contact which you want to update 
      * @return true if contact is updated successfully<br/> 
      *   false if contact is not updated <br/> 
      *   false if phone number contains any characters(It should contain only digits)<br/> 
      *   false if email Address is invalid <br/><br/> 
      *   
      * You can pass any one among the 3 parameters to update a contact.Passing all three parameters as <b>null</b> will not update the contact   
      * <br/><br/><b>Note: </b>This method requires permission <b>android.permission.WRITE_CONTACTS</b><br/> 
      */ 

      public boolean updateContact(String name, String number, String email,String ContactId) 
      { 
       boolean success = true; 
       String phnumexp = "^[0-9]*$"; 

       try 
       { 
         name = name.trim(); 
         email = email.trim(); 
         number = number.trim(); 

       if(name.equals("")&&number.equals("")&&email.equals("")) 
       { 
        success = false; 
       } 
       else if((!number.equals(""))&& (!match(number,phnumexp))) 
       { 
        success = false; 
       } 
       else if((!email.equals("")) && (!isEmailValid(email))) 
       { 
        success = false; 
       } 
       else 
       { 
        ContentResolver contentResolver = activity.getContentResolver(); 

        String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 

        String[] emailParams = new String[]{ContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}; 
        String[] nameParams = new String[]{ContactId, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}; 
        String[] numberParams = new String[]{ContactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}; 

        ArrayList<android.content.ContentProviderOperation> ops = new ArrayList<android.content.ContentProviderOperation>(); 

       if(!email.equals("")) 
       { 
        ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI) 
          .withSelection(where,emailParams) 
          .withValue(Email.DATA, email) 
          .build()); 
       } 

       if(!name.equals("")) 
       { 
        ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI) 
          .withSelection(where,nameParams) 
          .withValue(StructuredName.DISPLAY_NAME, name) 
          .build()); 
       } 

       if(!number.equals("")) 
       { 

        ops.add(android.content.ContentProviderOperation.newUpdate(android.provider.ContactsContract.Data.CONTENT_URI) 
          .withSelection(where,numberParams) 
          .withValue(Phone.NUMBER, number) 
          .build()); 
       } 
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 
       } 
       } 
       catch (Exception e) 
       { 
       e.printStackTrace(); 
       success = false; 
       } 
       return success; 
      } 



    // To get COntact Ids of all contact use the below method 

    /** 
     * @return arraylist containing id's of all contacts <br/> 
     *   empty arraylist if no contacts exist <br/><br/> 
     * <b>Note: </b>This method requires permission <b>android.permission.READ_CONTACTS</b> 
     */ 
     public ArrayList<String> getAllConactIds() 
     { 
      ArrayList<String> contactList = new ArrayList<String>(); 

      Cursor cursor = activity.managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, "display_name ASC"); 

       if (cursor != null) 
       { 
        if (cursor.moveToFirst()) 
        { 
         do 
         { 
          int _id = cursor.getInt(cursor.getColumnIndex("_id")); 
          contactList.add(""+_id); 

         } 
         while(cursor.moveToNext()); 
        } 
       } 

      return contactList; 
     } 


private boolean isEmailValid(String email) 
    { 
     String emailAddress = email.toString().trim(); 
     if (emailAddress == null) 
      return false; 
     else if (emailAddress.equals("")) 
      return false; 
     else if (emailAddress.length() <= 6) 
      return false; 
     else { 
      String expression = "^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)[email protected][a-z][a-z|0-9|]*\\.([a-z][a-z|0-9]*(\\.[a-z][a-z|0-9]*)?)$"; 
      CharSequence inputStr = emailAddress; 
      Pattern pattern = Pattern.compile(expression, 
        Pattern.CASE_INSENSITIVE); 
      Matcher matcher = pattern.matcher(inputStr); 
      if (matcher.matches()) 
       return true; 
      else 
       return false; 
     } 
    } 

    private boolean match(String stringToCompare,String regularExpression) 
    { 
     boolean success = false; 
     Pattern pattern = Pattern.compile(regularExpression); 
     Matcher matcher = pattern.matcher(stringToCompare); 
     if(matcher.matches()) 
      success =true; 
     return success; 
    } 
4

// Ci dispiace per il mio cattivo inglese // Sembra che nel primo post si è dimenticato di aggiungere il MimeType in funzione.

String selectPhone = Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "='" + 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + "'" ; 
       String[] phoneArgs = new String[]{String.valueOf(rawContactId)}; 
       ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
        .withSelection(selectPhone, phoneArgs) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE) 
        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, POSTCODE) 

**

// Basta aggiungere questa linea .withValue(Data.MIMETYPE, "vnd.android.cursor.item/postal-address_v2")

**

 .build()); 
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Si prega di controllare questo e fammi sapere il risultato

0

dovresti usare "Data.RAW_CONTACT_ID" invece di "Data.CONTACT_ID" nella clausola di selezione.

Problemi correlati