【问题标题】:How to update existing contact?如何更新现有联系人?
【发布时间】:2012-01-19 09:07:15
【问题描述】:

我有一个现有联系人,我需要为该现有联系人添加工作地址。我正在使用以下代码,但它不起作用。

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

有什么解决办法吗?

【问题讨论】:

  • 我也遇到了同样的问题,但无济于事,有人帮忙吗?

标签: android contacts android-contacts android-cursor


【解决方案1】:
        /**
             * @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]+)*)?@[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;
    }

【讨论】:

  • 如果只有 1 个电话号码或姓名或电子邮件,则此答案是正确的。如果有多个电话号码。例如你应该添加String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?"; String[] numberParams = new String[]{ContactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, oldPhoneNumber};来正确修改一个contact_id中的所有电话号码
【解决方案2】:

//对不起我的英语不好 // 好像在第一篇文章中您忘记在操作中添加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);

请检查并告诉我结果

【讨论】:

    【解决方案3】:

    我终于找到了合适的解决方案。非常感谢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;
        }
    

    只有这个才是诀窍..

    【讨论】:

      【解决方案4】:

      每个字段(电子邮件、姓名、地址)都有自己的 mime 类型,您应该使用它来更新字段。

      我们将使用 Data 表,其中每个 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,因为这样的行还不存在。

      【讨论】:

        【解决方案5】:

        您应该在选择子句中使用“Data.RAW_CONTACT_ID”而不是“Data.CONTACT_ID”。

        【讨论】:

          【解决方案6】:

          也许您可以使用Intent and its ACTION_EDIT 让您的用户编辑工作地址...

          【讨论】:

          • 这个不太理想,我之前试过但是不符合我的应用要求。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-22
          • 2018-01-26
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多