2017-08-09 26 views
0

ERP systemと電話でsync adaptersync contactsを開発中です。 エミュレータではすべて正常に動作しますが、電話では「手で」作成された既存の連絡先に新しい電話番号が割り当てられます。新しい連絡先をアンドロイドの連絡先に挿入するときに電話番号が既存の連絡先に添付されます

int rawContactInsertIndex =0; 
    // Add new items http://techblogon.com/insert-new-contact-in-android-code-example/ 
    for (RestAPIContactParser.Entry e : entryMap.values()) { 
        rawContactInsertIndex = batch.size(); 
... 
batch.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
        .withValue(ContactsContract.RawContacts.SOURCE_ID, e.code) 
        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE) 
        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, ACCOUNT_NAME) 
        rawContactInsertIndex) 
        .build()); 
... batch.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
         .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, e.phone) 
         .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK) 
         .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) 
         .build()); 

アカウントの連絡先を削除すると、挿入された電話番号も既存の連絡先から削除されます。 エミュレータで新しい連絡先を作成して同期しようとしていて、すべてが問題なく、新しい電話番号が古い連絡先に添付されていませんでした。 アイデア 編集:RawContactsテーブルのデータベース構造が明確ではありません。

rawContactInsertIndex =max(ContactsContract.Data.RAW_CONTACT_ID)+1 

ような何かをして、代わりにrawContactInsertIndex = batch.size()のrawContactInsertIndexをインクリメントうか?

+0

電話からすべての連絡先を手動で削除し、バックアップから.vcfをインポートしてから、同期アダプタをインストールして問題が解決しました。私が理解する限り、私は連絡先に孤児をいくつか持っていました。 –

答えて

0

これは新しいRawContactが挿入されるたびに、システムはその新しいRawContactは、既存のContactの複製であるかどうかをチェックしてみてください、とAggregationExceptionsを使用して、既存のContactにその新しいRawContactに参加しようと、Androidの中に予想される動作であります表。 名前、電話、電子メールを使用して、潜在的な既存の連絡先を探す。

あなたは私にあなたの新しいRawContactしたくない場合は、既存の連絡先(ただし、あなたがこれはあなたのユーザーが重複する連絡先に文句を言うにしたくないです再考すべきである)に統合され、あなたはAggregationExceptionsTYPE_KEEP_SEPARATEルールを追加することができます、あなたのRawContactは参加すべきではありません指定:

ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI) 
    .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE) 
    .withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact) 
    .withValue(AggregationExceptions.RAW_CONTACT_ID2, anExistingRawContact) 
    .build(); 

私は自分のアカウントの連絡先を削除

...

をクレアたContactsを削除することはありませんあなたのアカウントに関連していないRawContactsが削除される可能性があります。 RawContactsのみ削除し、必要に応じて関連する連絡先を自動削除します。

rawContactInsertIndex = MAX(ContactsContract.Data.RAW_CONTACT_ID)+1

ないような何かをしなければなりません! RawContact IDは自動的に割り当てられます。自分で設定しないでください。

.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 

を、同じバッチで一緒に必ずapplyBatchすべての関連の操作を行います。 あなたは行う必要があります。

+0

AggregationExceptionsの説明をありがとう。アカウントのrawcontactsを何度も削除しました。副作用はなく、rawcontactsを削除すると、アカウント名と型を常にクエリパラメータとして指定しています。 –

+0

はい、いいです。他のアカウントのデータを削除する可能性があるので、 'RawContacts'だけを削除して' Contacts'を削除しないよう注意してください。 – marmor

関連する問題