2010-06-03 53 views
0

我想顯示聯繫人的姓名,電話號碼和電子郵件,並讓用戶更新任何值。出於某種原因,當我的代碼執行時,電子郵件的價值將被覆蓋在所有三個字段上。這裏的邏輯應該有一個小故障,但我無法弄清楚。更新聯繫人導致寫入錯誤的值

這裏是我更新Contacts URI的方法。

private void updateContact() { 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, name) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name) 
      .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber) 
      .withValue(ContactsContract.Data.MIMETYPE, 
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .build()); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Email.DATA, email) 
      .build()); 

    try { 
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     // Display update 
     Context ctx = getApplicationContext(); 
     CharSequence txt = "Contact Updated"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(ctx, txt, duration); 
     toast.show(); 

    } catch (Exception e) { 
     // Display warning 
     Context ctx = getApplicationContext(); 
     CharSequence txt = "Update Failed"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast = Toast.makeText(ctx, txt, duration); 
     toast.show(); 

    } 
} 

回答

7

看到此鏈接:

http://comments.gmane.org/gmane.comp.handhelds.android.devel/92848

「你不應該在指定的更新語句MIME類型 - 這是不可更新的。」

「您的查詢說:」更新全部此聯繫人的數據行,將其中一個字段設置爲「John」,另一個字段設置爲「Abraham」。數據行包括電話號碼,電子郵件,照片,你的名字。你需要做的是找到你想要更新的特定數據行,然後在選擇中使用它的_id(或者更常見的是在URI本身中)。「

」聯繫人的數據結構基於三單獨的表格:聯繫人,RawContacts和數據。聯繫人可以有多個RawContacts,它們可以有多個Data行。每個數據行都有一個MIME類型,用於指定該行中存儲哪種數據。聯繫人姓名存儲在MIME類型爲StructuredName.CONTENT_TYPE的行中。

因此,爲了更改聯繫人名稱,您首先需要找到包含該名稱的Data行,然後更新該Data行。該供應商將負責其餘的(如促進名稱RawContact,然後聯繫的水平)「

0

另見

http://www.eoeandroid.com/sdk/api/reference/android/provider/ContactsContract.Data.html

必須首先獲取數據ID:

的ArrayList ops = Lists.newArrayList(); ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) .withSelection(Data._ID +「=?」,new String [] {String.valueOf(dataId)}) .withValue (Email.DATA,「[email protected]」) .build()); getContentResolver()。applyBatch(ContactsContract.AUTHORITY,ops);