2017-08-19 10 views
0

連絡先に関連するデータを保存する必要があるアプリを開発しています。連絡先のデータを保存すると新しいものが追加されます

私はカーソルを使用してrecycleViewに連絡先をリストし、各itemViewには連絡先をお気に入りとして設定するためのスターボタンがあります(システムと同じではありません)。

が、私はこれをやって、ContactsContract.Dataにデータを格納するために管理:二つの接点がまったく同じ名前のEJを持っている場合

private void addContactData(long contactId, String displayName, boolean favorite) { 

    // displayName same as the value for Contacts.DISPLAY_NAME_PRIMARY 

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

    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, CUSTOM_ACCOUNT_TYPE) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, CUSTOM_ACCOUNT_NAME) 
      .withValue(ContactsContract.RawContacts.CONTACT_ID, contactId) 
      .build()); 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) 
      .build()); 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, CustomData.CONTENT_ITEM_TYPE) 
      .withValue(CustomData.IS_FAVORITE, favorite) 
      .build()); 

    try { 
     ContentProviderResult[] contentProviderResults = cr.applyBatch(ContactsContract.AUTHORITY, ops); 
     return contactUri; 
    } catch (RemoteException | OperationApplicationException e) { 
     Log.e(getClass().getSimpleName(), e.getMessage(), e); 
     return null; 
    } 
} 

私が持っている問題があります。私がfavボタンを押すと "Tom"と "Tom"が、デバイスの連絡先アプリにリストされている3番目の連絡先を追加しています。

いくつかの検索には、使用して連絡先を区別するために、より多くのデータを追加するために私をguied:

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) 
      .build()); 
// OR 

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email) 
      .build()); 

をそして、それはフィールドが両方の接点で対等であれば除いて、うまく働きました。この動作を避けるためには何が必要なのですか。このような操作を行うにはCONTACT_IDでは不十分なのはなぜですか?

答えて

1

あなたが今作成した新しいRawContactをいくつかの(1つ以上の)既存のRawContactsとマージするようにAndroidに伝える必要があります。

これは、AggregationExceptionテーブルを使用して、そのような「リンク」ごとに行を追加します。

参照:https://stackoverflow.com/a/40869351/819355

コードスニペット:

Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI); 
builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, someExistingRawContact); 
ContentProviderOperation op = builder.build(); 
+0

が、これは私はまだ持っている唯一の問題は、SIMの連絡先である、作品、ありがとうございます。 WhatsAppのようなアプリケーションでも連絡先の複製が追加されているので、他の方法はないと思う。私はそれについていくつかのドキュメントを探していますが、まだ何も、とにかく助けてくれてありがとう。 – GLopez

+0

ああ、sim連絡先は他の連絡先にマージすることはできません、それはSIM連絡先プロトコルの制限です – marmor

関連する問題