如何在插入新联系人时检测重复的联系人?

时间:2013-03-20 23:14:50

标签: android

对于联系人备份应用程序,我将所有信息保存到CSV文件,然后我需要将其还原。它工作得很好,但如果我按两次恢复,它会复制所有联系人。

我尝试使用以下代码删除重复项,但它确实有效,但在某些情况下会失败。 基本上,当没有明确的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获得相同的结果。

然而,我注意到,如果我在同一设备/模拟器上创建联系人,则在重新恢复相同的联系人时会检测到副本。 在浏览设备时,似乎它不起作用的一个原因是在某些时候删除了特殊的字符。 对于例如显示名称“John.Doe”从CSV中读取,但插入后,它变为“John Doe”。我无法在代码中看到“。”被剥夺了。

2 个答案:

答案 0 :(得分:1)

发生的情况取决于设备运行的Android版本。如果版本是Honeycomb(3.0)或更高版本,则联系人将始终具有名称。名称字段为DISPLAY_NAME_PRIMARY,如果任何原始联系人中没有姓名,则此字段将设置为电话号码或电子邮件地址。

很难确切知道你的代码究竟发生了什么,因为我无法告诉你在所有情况下如何调用contactExists。但我猜你正在看DISPLAY_NAME,当你想看看DISPLAY_NAME_PRIMARY时。

作为一个评论,你在这里想做的事情充满了危险。联系人提供商是一个复杂的系统,将其备份到CSV可能会导致很多问题。更好的策略是在联系人提供商和基于云的Google通讯录应用之间运行同步。

答案 1 :(得分:0)

以下是找到重复联系人的代码。您需要将“NAME”作为字符串传递,它将查找重复项。它适用于ICS,但没有检查GB,所以基本上你需要试试运气。

/**
     * @param name
     * @param context
     * @return
     */
    public boolean isContactExist(String name) {
        boolean result = false;
        try {
            ContentResolver contentResolver = getContentResolver();
            Uri uri = Data.CONTENT_URI;
            String[] projection = new String[] { PhoneLookup._ID,
                    PhoneLookup.LOOKUP_KEY };
            String selection = StructuredName.DISPLAY_NAME + " = ?";
            String[] selectionArguments = { name };
            Cursor cursor = contentResolver.query(uri, projection, selection,
                    selectionArguments, null);

            if (cursor != null) {
                while (cursor.moveToNext()) {
                    /*
                     * Log.i(TAG, "KEY = " + cursor.getString(cursor
                     * .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)));
                     */
                    result = true;
                }
            }
            cursor.close();
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
        }
        return result;
    }