1

連絡先のバックアップアプリの場合、すべての情報をCSVファイルに保存してから、復元する必要があります。うまく機能しますが、復元を2回押すと、すべての連絡先が複製されます。

次のコードを試して重複を削除しましたが、機能しますが、場合によっては失敗します。基本的に、明示的なDISPLAY_NAMEがない場合、たとえば連絡先に電話番号しかないようで、DISPLAY_NAMEが電話番号である場合、または電子メールアドレスの場合は同じである場合は失敗します。DISPLAY_NAMEフィールドに電話番号/メールアドレスが含まれているように見えるので、なぜそれが常に機能しないのか理解できません。

これが私が使用したコードです:

private boolean contactExists(String displayname, String emailstring, String phonestring){
           Cursor crsr = BA.applicationContext.getContentResolver().query(
                   ContactsContract.Contacts.CONTENT_URI,
                   new String[] { "display_name", "_id"},                  
                   "display_name = ? ",
                   new String[] {displayname},
                   null);


           while (crsr.moveToNext()){
                HashMap m = new HashMap();
                for (int col = 0; col < crsr.getColumnCount(); col++) {
                  m.put(crsr.getColumnName(col), Integer.valueOf(col));
                }
               int id = crsr.getInt(((Integer)m.get("_id")).intValue());
               String emails = GetEmails(id);
               String phones = GetPhones(id);

               if (emails.contentEquals(emailstring) && phones.contentEquals(phonestring))
               {
                   crsr.close();
                   return true;
               }
           }
           crsr.close();
           return false;
    }

更新: DISPLAY_NAME_PRIMARYを試してみたところ、同じ結果になりました。

ただし、同じデバイス/エミュレーターで連絡先を作成した場合、同じ連絡先を復元すると、重複が検出されることに気づきました。デバイス間を移動すると、機能しない理由の1つは、ある時点で特別な文字が削除されていることです。たとえば、表示名「John.Doe」はCSVから読み取られますが、挿入されると「JohnDoe」になります。コードのどこに「。」が表示されているのかわかりません。これまでに取り除かれます。

4

2 に答える 2

1

何が起こるかは、デバイスが実行している Android のバージョンによって異なります。バージョンが Honeycomb (3.0) 以降の場合、連絡先には常に名前があります。名前フィールドは DISPLAY_NAME_PRIMARY です。生の連絡先のいずれにも名前がない場合、このフィールドは電話番号または電子メール アドレスに設定されます。

すべての場合で contactExists をどのように呼び出しているのか分からないため、コードで何が起こっているのかを正確に知ることは困難です。しかし、私の推測では、DISPLAY_NAME_PRIMARY を見たいときに、DISPLAY_NAME を見ていると思います。

余談ですが、ここでやろうとしていることは危険に満ちています。連絡先プロバイダーは複雑なシステムであり、CSV にバックアップすると、後で多くの問題が発生する可能性があります。はるかに優れた戦略は、連絡先プロバイダーとクラウドベースの Google 連絡先アプリの間で同期を実行することです.

于 2013-03-21T00:24:45.930 に答える