連絡先の表示名を更新するにはどうすればよいですか?以下のコードの操作は何もスローせずに完了し、機能しているように見えます。つまり、ContactsContract.Contactテーブルを再クエリすると、名前が変更された行が返されました。しかし、タブレットでストックの「人」アプリを実行しようとすると、クラッシュしました。明らかに私は何か間違ったことをしました。
これがコードです。早い段階で、次のように集約連絡先からIDをフェッチします。ここでkeyはlookup_keyです。
String[] projection = new String[] {
Contacts._ID, // 0
Contacts.DISPLAY_NAME, // 1
};
Uri uri = Uri.parse (Contacts.CONTENT_LOOKUP_URI + "/" + key);
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query (uri, projection, null, null, null);
if (!cursor.moveToNext()) // move to first (and only) row.
throw new IllegalStateException ("contact no longer exists for key");
origId = cursor.getLong(0);
cursor.close();
次に、ユーザーが編集を行った後、このコードブロックを呼び出してdisplay_nameを更新します。
ArrayList<ContentProviderOperation> opers = new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder builder = null;
String[] args = { Long.toString (origId) };
builder = ContentProviderOperation.newUpdate (Data.CONTENT_URI);
builder.withSelection (RawContacts.CONTACT_ID + "=?", args);
builder.withValue(CommonDataKinds.StructuredName.DISPLAY_NAME, name);
opers.add(builder.build());
ContentProviderResult[] results = null;
try {
results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, opers);
} catch ...
この例ではContentProviderOperationは必要ないことに気づきました。それは後で更新するものがもっとあるときのためです。
正直なところ、実際に使用しているIDについてはかなり混乱しています。名前は私にはそれほど明確ではなく、この操作に間違ったIDを使用している可能性があります。
更新後の結果を見ると、結果コードが5であることがわかりました。そのためのドキュメントが見つからないため、それが重要かどうかはわかりません。