我正在尝试插入和更新现有联系人的一条信息,因此我创建了一个示例应用程序以开发function。 我希望我的示例应用程序执行的操作是插入(或者如果存在)更新联系人的电子邮件地址。

我正在通过系统Intent选择一个联系人,如下所示:startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);

返回的URI是Contact ( RawContact ?)的URI,它被选中并以这种forms出现: 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.Email Data成员:

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

然后执行以下操作之一以Insert或Update 数据 :

ArrayList ops = new ArrayList(); ops.add(ContentProviderOperation.newInsert(mContactUri) .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) .withValue(Email.DISPLAY_NAME, "somebody@android.com") .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,我正在使用这些权限:

Android用户需要更新他们的文档 。 它实际上让我更少了解发生的事情,而不是从猜测中得到的。 它建议您可以撤回一个Contact ,该Contact将包含许多将包含Data RawContacts 。

这种解释是完全错误的。 ContactContracts数据是三个正常的平均日常数据库表*:

ContactContract Tables

表: 联系人

访问URI: Contacts.CONTENT_URI

主键**: Data._ID

描述:

此表包含有关联系人的信息(何时添加,是什么用户图标,是否有自定义铃声)。

关系:它与RawContact表具有1对多的关系。

表: RawContacts

访问URI: RawContacts.CONTENT_URI

主键: Data._ID

外键**: Data.CONTACT_ID

描述:

此表包含有关一组相关数据项的信息。 RawContact可以包含电子邮件types,电子邮件显示名称,电话号码,电话显示名称等.RawContact可以与其他RawContacts聚合,以便在用户看到它时建立Contact 。 联系人只能包含一个RawContact。

关系:它与Data表具有1对多的关系。

表: 数据

访问URI: Data.CONTENT_URI

主键: Data._ID

外键: Data.RAW_CONTACT_ID

描述:

该表包含单个信息字段。 电子邮件地址,电话号码,电话号码types(家庭/工作),昵称,显示名称。

在回答这个问题时

我已将整个示例项目上传到GitHub,以便其他人可以查看如何使用ContactContract查询,更新和插入记录。

您可以在此处find要下载的项目: https : //github.com/gwoodhouse/ContactContractSample

如果你只是想查看执行查询/更新/插入的java代码,这里是类文件: https : //github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity /ContactsIntegrationActivity.java

希望这可以帮助!

*不是表格,而是ContentProvider

**并非严格属实。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐