Android - 更新电话簿中的联系人

问题描述:

我仍在使用电话簿应用程序,并且想要更新存储在电话簿中的联系人。我可以插入新的联系人,但更新完全没有效果。Android - 更新电话簿中的联系人

这里是我使用的代码:

public void update(Relation r) 
{ 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    // Name 
    Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, r.getBook_id()); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName()+ " " +r.getLastName()); 
    ops.add(builder.build()); 

    // Number 
    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, r.getBook_id()); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber()); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); 
    ops.add(builder.build()); 

    // Picture 
    try 
    { 
     Bitmap bitmap = MediaStore.Images.Media.getBitmap(MyApplication.getInstance().getContentResolver(), Uri.parse(r.getPhoto())); 
     ByteArrayOutputStream image = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, r.getBook_id()); 
     builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
     ops.add(builder.build()); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    // Update 
    try 
    { 
     MyApplication.getInstance().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

上面的一个不工作,但此人做(插入):

public void insert(Relation r) 
{ 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    int rawContactInsertIndex = ops.size(); 

    Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI); 
    builder.withValue(RawContacts.ACCOUNT_TYPE, null); 
    builder.withValue(RawContacts.ACCOUNT_NAME, null); 
    ops.add(builder.build()); 

    // Name 
    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName()+ " " +r.getLastName()); 
    ops.add(builder.build()); 

    // Number 
    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber()); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); 
    ops.add(builder.build()); 

    // Picture 
    try 
    { 
     Bitmap bitmap = MediaStore.Images.Media.getBitmap(MyApplication.getInstance().getContentResolver(), Uri.parse(r.getPhoto())); 
     ByteArrayOutputStream image = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
     ops.add(builder.build()); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    // Add the new contact 
    ContentProviderResult[] res; 
    try 
    { 
     res = MyApplication.getInstance().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     if (res != null && res[0] != null) 
     { 
      String uri = res[0].uri.getPath().substring(14); 
      r.setBook_id(new Integer(uri).intValue()); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

你能告诉我,如果我这样做在好还是不好?

谢谢。

问候。

V.

+0

解决。上面的代码是正确的。这是一个数据库错误。 – Manitoba 2012-03-28 09:46:05

已解决。检查前一条消息。

为什么在更新方法中使用newInsert?为什么不newUpdate?也许这是一个错误。请再次检查您的代码,我想引用您的代码。

我有一个联系人的更新名称相同的问题,虽然它不会抛出任何异常,我找不到从哪里来的问题。

+0

解决。请参阅此链接:http://*.com/a/9924883/1064858 – qmn1711 2012-07-12 07:59:05