0

次のように電話番号を更新できます。

 ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
         .withSelection("_id =?", new String[] { id })
         .withValue(Phone.NUMBER, "5555555555").build());

         getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

しかし、表示名を更新すると、機能しません。

ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
         .withSelection("_id=?", new String[] { id })
         .withValue("display_name", "jack").build());

これはどちらの言葉でもありません:

context.getContentResolver().update(
                ContactsContract.Data.CONTENT_URI,
                values,
                ContactsContract.CommonDataKinds.StructuredName._ID + "="
                        + id
                        + " and  mimetype='vnd.android.cursor.item/name'",
                null);
4

1 に答える 1

2

display_name は読み取り専用です。

Contacts Provider で詳細な作業を行いたい場合は、必ずContacts Provider API ガイドを読み、Contacts Provider Android トレーニングに従う必要があります。連絡先プロバイダーは、多くの規則を持つ複雑なデータベース システムであり、プロバイダーの基本的なレイアウトを理解していないと、イライラする問題に遭遇するでしょう。

CommonDataKinds.StructuredName.DISPLAY_NAME と CommonDataKinds.Phone.NUMBER の両方が data1 に設定されています。これは、実際にはこれらが別々のテーブルを参照していないためです。代わりに、どちらも ContactContracts.Data の列 DATA1 を参照します。連絡先のすべての詳細データは、内容に関係なく、ContactContracts.Data に保存されます。たとえば、連絡先のすべての電話番号とすべての電子メール アドレスは、ContactContracts.Data に保存されます。行のタイプを別のタイプから識別する方法は、行の MIMETYPE 値を使用することです。ドキュメントでは、これについて詳しく説明しています。

もう 1 つのヒント: 独自のコードで連絡先プロバイダーの追加、削除、または更新を行うことは避けてください。代わりに、デバイスの連絡先アプリを起動するか、ユーザーが使用する連絡先アプリを選択できるようにするインテントを送信します。これにより、ユーザーはアプリではなく連絡先アプリで作業を行うことができます。これはドキュメントにも記載されています。

于 2013-04-24T02:51:02.040 に答える