1

对于联系人备份应用程序,我将所有信息保存到 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”。我看不到代码中“。”的位置。永远被剥离出来。

4

2 回答 2

1

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

很难确切地知道您的代码发生了什么,因为我无法告诉您在所有情况下如何调用contactExists。但我的猜测是您正在查看 DISPLAY_NAME,而您可能想要查看 DISPLAY_NAME_PRIMARY。

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

于 2013-03-21T00:24:45.930 回答
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;
    }
于 2014-03-07T07:48:38.117 回答