修改联系人信息
我试图插入并更新现有联系人上的一条信息,因此我创建了示例应用程序以开发功能。我想让我的示例应用程序执行的操作是插入(或者如果存在)更新联系人的电子邮件地址。修改联系人信息
我选择通过该系统意图的接触像这样:
startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);
的URI被返回是,Contact
的哪个被选择并附带以这种形式(RawContact
): content://com.android.contacts/contacts/lookup/0r2-2A90214945/2
。
我可以通过执行以下代码拉回来所有的Data
(RawContact
?)项目在此:
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;
,然后执行下列步骤,Insert
或Update
的Data之一:
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" />
Android的人需要更新他们的documentation。它实际上使我知道更少关于正在发生的事情比我从猜测中得到的结果。这表明你可以退回Contact
,其中将包含许多RawContacts
,其中将包含Data
。
这种解释是完全错误的。 ContactContracts数据是不是三个正常的平均日常数据库表*:
ContactContract表
表:Contacts
访问URI:
Contacts.CONTENT_URI
主键**:
Data._ID
说明:
此表包含有关联系人(何时添加,它是用户图标,它是否具有自定义铃声)的信息。
关系:它与
RawContact
表有一对多的关系。
访问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
**不严格如此。
引用您的陈述:“联系人可能只包含一个RawContact”......我认为联系人是许多RawContacts的联合。纠正我,如果我错了。 – 2013-11-20 11:48:30
(这已经有一段时间了,但是)我认为'Contact'只能包含一个'RawContact'并且仍然有效。 – Graeme 2013-11-20 11:57:32
是的,但如果包含许多RawContacts,它仍然有效。 尽管感谢您的项目。 – 2013-11-20 12:47:45
好的,我会删除它。谢谢 – 2012-01-10 11:49:32