連絡先のバックアップアプリの場合、すべての情報を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」になります。コードのどこに「。」が表示されているのかわかりません。これまでに取り除かれます。