2011-12-13 21 views
16

Tengo un contacto existente, necesito agregar una dirección de trabajo a ese contacto existente. Estoy usando el siguiente código, pero no está funcionando.¿Cómo actualizar un contacto existente?

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

¿Alguna solución para esto?

+0

Estoy experimentando el mismo problema sin éxito, ¿alguien puede ayudarme? – user788511

+0

¿alguien por favor ayuda? – user788511

Respuesta

0

Tal vez usted podría utilizar Intent and its ACTION_EDIT para obtener su usuario editar la dirección de trabajo ...

+0

Esto no es ideal, lo intenté antes pero no cumple con los requisitos de mi aplicación. – user788511

1

Finalmente encontré las gracias solution..Much apropiadas para este How to modify existing Contact

El secreto es que usted tiene que pasar dos valores para .withSelection como se muestra a continuación:

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

donde por valor Data._ID mDataId se obtiene de esta manera:

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

y el método getCursorString es algo así como:

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

Esto y sólo esto es el truco ..

1

Cada campo (correo electrónico, nombre, adreess) tiene su propio tipo MIME, que se debe utilizar para actualizar el campo

Trabajaremos con la tabla de datos, donde cada Data.RAW_CONTACT_ID representa un detalle sobre algún contacto.

Por lo tanto, tenemos que encontrar el Data.RAW_CONTACT_ID donde el id es el id del contacto que desea editar.

Espero que este código sea útil para usted.

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

Si se ha creado un nuevo contacto, pero sin dirección, y ahora desea agregar una dirección a ese contcat. En este caso, use la misma consulta que la anterior, pero simplemente cambie newUpdate a newInsert, ya que dicha fila aún no existe.

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

// Lo siento por mi mala Inglés // Parece que en el primer post que se olvidó de añadir el MimeType en funcionamiento.

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) 

**

// Sólo tiene que añadir esta línea .withValue(Data.MIMETYPE, "vnd.android.cursor.item/postal-address_v2")

**

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

Por favor marque esta y quiero saber el resultado

0

debe usar "Data.RAW_CONTACT_ID" en lugar de "Data.CONTACT_ID" en la cláusula de selección.

Cuestiones relacionadas