android
  • contacts
  • android-contacts
  • android-cursor
  • 2011-12-13 47 views 16 likes 
    16

    我有一個現有的聯繫人,我需要爲該現有的聯繫人添加工作地址。我正在使用下面的代碼,但它不工作。如何更新現有聯繫人?

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

    任何解決方案?

    +0

    我遇到同樣的問題,無濟於事,任何幫助任何人? – user788511

    +0

    任何人請幫忙? – user788511

    回答

    0

    也許你可以使用Intent and its ACTION_EDIT讓你的用戶編輯工作地址...

    +0

    這並不理想,我之前嘗試過但它不符合我的應用程序的要求。 – user788511

    1

    終於讓我找到合適的solution..Much感謝這個How to modify existing Contact

    的祕密是,你必須通過兩項對於.withSelection值如下所示:

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

    在由Data._ID值mDataId獲得這樣:

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

    而且getCursorString方法是一樣的東西:

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

    這也只有這個是招..

    1

    每個字段(電子郵件,姓名,adreess)都有自己的MIME類型,您應該使用以便更新該字段。

    我們將使用數據表,其中每個Data.RAW_CONTACT_ID代表關於某個聯繫人的詳細信息。

    因此,我們需要找到Data.RAW_CONTACT_ID,其中的id是您要編輯的聯繫人的ID。

    我希望這段代碼對你有所幫助。

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

    如果已創建新聯繫人但沒有地址,現在您想要爲該聯繫人添加地址。在這種情況下,使用與上面相同的查詢,但只需將newUpdate更改爲newInsert,因爲此行尚不存在。

    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

    //對不起我的英文不好 //看來,在第一篇文章,你忘了加上MimeType運行。

    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) 
    

    **

    //剛加入這一行.withValue(Data.MIMETYPE, "vnd.android.cursor.item/postal-address_v2")

    **

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

    請檢查這一點,讓我知道結果

    0

    您應該在選擇條款中使用「Data.RAW_CONTACT_ID」而不是「Data.CONTACT_ID」。

    相關問題