1

連絡先の表示名を更新するにはどうすればよいですか?以下のコードの操作は何もスローせずに完了し、機能しているように見えます。つまり、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であることがわかりました。そのためのドキュメントが見つからないため、それが重要かどうかはわかりません。

4

2 に答える 2

6

ID(および一般的な連絡先の変更)はかなり混乱する可能性があります...私はいくつかのドラマにも頭を悩ませていました。

これが私が更新に使用するいくつかの作業コードです。私が見ることができる主な違いは、生のIDをどのように宣言しているかです。コンテンツ値として含める必要があります。

Cursor cursor = _context.getContentResolver().query(contactUri,
            new String[] { Contacts._ID }, null, null, null);
    try {
        if (cursor.moveToFirst()) {
            String rawContactId = cursor.getString(0);
            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
            ContentValues contentValues = new ContentValues();
            contentValues.put(Data.RAW_CONTACT_ID, rawContactId);

            contentValues
                    .put(ContactsContract.Data.MIMETYPE,
                            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            contentValues.put(
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    phoneNumber);
            contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE,
                    ContactsContract.CommonDataKinds.Phone.TYPE_WORK);

            ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                    .withValues(contentValues).build());
            String contactId = contactUri.getLastPathSegment();
            ops.add(ContentProviderOperation
                        .newUpdate(ContactsContract.Data.CONTENT_URI)
                        .withSelection(
                                ContactsContract.Data.CONTACT_ID
                                        + "=? AND "
                                        + ContactsContract.Data.MIMETYPE
                                        + "=?",
                                new String[] {
                                        contactId,
                                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE })
                        .withValue(
                                ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                newName).build());

            result = _context.getContentResolver().applyBatch(
                    ContactsContract.AUTHORITY, ops);
        }
    } finally {
        cursor.close();
    }

うまくいけば、それは役に立ちます!

于 2012-12-03T01:57:53.910 に答える
0

上記の答えは一般的に正しいです。しかし、挿入したとき

ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME その後、newUpdateを実行しようとしました

ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME

上記のコードで-連絡先アプリに古いデータと新しいデータが混在する名前で連絡先が表示されます。ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAMEたとえば、挿入と更新が期待どおりに機能することがわかりました。Android 4xの連絡先アプリで連絡先を編集すると、家族が表示されず、個別に指定されます。DISPLAY_NAMEはAndroidによって作成されています。

于 2015-12-18T18:29:38.603 に答える