2012-01-09 176 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