修改联系信息

时间:2012-01-09 11:56:09

标签: android android-contacts contactscontract

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

我正在通过系统Intent选择联系人:

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

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

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

然后对InsertUpdate Data执行以下操作之一:

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

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,我正在使用这些权限:

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

1 个答案:

答案 0 :(得分:44)

Android用户需要更新他们的documentation。它实际上让我知道关于发生的事情,而不是我猜测的结果。它建议您撤回Contact,其中包含许多RawContacts,其中包含Data

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

ContactContract Tables

表:Contacts

  

访问URI:Contacts.CONTENT_URI

     

主键**:Data._ID

     

描述:

     

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

     

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

表:RawContacts

  

访问URI:RawContacts.CONTENT_URI

     

主键:Data._ID

     

外键**:Data.CONTACT_ID

     

描述:

     

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

     

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

表: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

** 严格为真。

相关问题