2012-01-09 166 views
18

我試圖插入並更新現有聯繫人上的一條信息,因此我創建了示例應用程序以開發功能。我想讓我的示例應用程序執行的操作是插入(或者如果存在)更新聯繫人的電子郵件地址。修改聯繫人信息

我選擇通過該系統意圖的接觸像這樣:

startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST); 

的URI被返回是,Contact的哪個被選擇並附帶以這種形式(RawContact): content://com.android.contacts/contacts/lookup/0r2-2A90214945/2

我可以通過執行以下代碼拉回來所有的DataRawContact?)項目在此:

Cursor cursor = contentResolver.query(mContactUri, null, null, null, null); 
try { 
    if (cursor.moveToFirst()) { 
     for(int i=0; i < cursor.getColumnCount(); i++) { 
      String message = cursor.getColumnName(i); 
      Log.v("", message); 
     } 
    } 
} finally { 
    cursor.close(); 
} 

從這個我應該能夠確定是否接觸已經有一個CommonDataTypes.EmailData成員:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1; 

,然後執行下列步驟,InsertUpdateData之一:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

ops.add(ContentProviderOperation.newInsert(mContactUri) 
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) 
    .withValue(Email.DISPLAY_NAME, "[email protected]") 
    .withValue(Email.TYPE, Email.TYPE_HOME) 
    .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

但是這給了我一個例外: java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

希望有人可以看到我已經錯過了。

PS,我使用這些權限:

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
+0

好的,我會刪除它。謝謝 – 2012-01-10 11:49:32

回答

43

Android的人需要更新他們的documentation。它實際上使我知道更少關於正在發生的事情比我從猜測中得到的結果。這表明你可以退回Contact,其中將包含許多RawContacts,其中將包含Data

這種解釋是完全錯誤的。 ContactContracts數據是不是三個正常的平均日常數據庫表*:

ContactContract表

表:Contacts

訪問URI:Contacts.CONTENT_URI

主鍵**:Data._ID

說明:

此表包含有關聯繫人(何時添加,它是用戶圖標,它是否具有自定義鈴聲)的信息。

關係:它與RawContact表有一對多的關係。

表:RawContacts

訪問URI:RawContacts.CONTENT_URI

主鍵:Data._ID

外鍵**:Data.CONTACT_ID

說明:

此表包含有關一組相關數據項的信息。一個RawContact可以包含電子郵件類型,電子郵件顯示名稱,電話號碼,電話顯示名稱等。一個RawContact可以與其他RawContacts聚合在一起,製成一個Contact,就像用戶看到它一樣。聯繫人可能只包含一個RawContact。

關係:它與Data表有一對多的關係。

表:Data

訪問URI:Data.CONTENT_URI

主鍵:Data._ID

外鍵:Data.RAW_CONTACT_ID

說明:

此表包含單個信息字段。電子郵件地址,電話號碼,電話號碼類型(家庭/工作),暱稱,顯示名稱。

在回答問題

我上傳整個樣本項目的GitHub爲了讓別人看如何查詢,更新和使用ContactContract插入記錄。

您可以找到項目在這裏下載: https://github.com/gwoodhouse/ContactContractSample

如果你只是想看看在Java代碼進行查詢/更新/插入這裏的類文件: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

希望這幫助!

*不是一個表,但ContentProvider

**不嚴格如此。

+0

引用您的陳述:「聯繫人可能只包含一個RawContact」......我認爲聯繫人是許多RawContacts的聯合。糾正我,如果我錯了。 – 2013-11-20 11:48:30

+0

(這已經有一段時間了,但是)我認爲'Contact'只能包含一個'RawContact'並且仍然有效。 – Graeme 2013-11-20 11:57:32

+1

是的,但如果包含許多RawContacts,它仍然有效。 儘管感謝您的項目。 – 2013-11-20 12:47:45