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

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

问题描述:

对于联系人备份应用程序,我将所有信息保存到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; 
    } 

UPDATE: 我试图与具有相同的结果DISPLAY_NAME_PRIMARY。

但是我注意到,如果我在同一个设备/仿真器上创建联系人,当我重新恢复相同的联系人时,检测到重复。 在穿越设备时,似乎有一个原因是不起作用的,那就是在某些时候特殊字符被删除。 例如从CSV读取显示名称“John.Doe”,但当它被插入时,它变成“John Doe”。我看不到代码中的“。”。被剥夺了。

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

很难确切地知道你的代码是怎么回事,因为我不能告诉你在所有情况下如何调用contactExists。但我的猜测是您正在查看DISPLAY_NAME,您可能想查看DISPLAY_NAME_PRIMARY。

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

+0

感谢您回复Joe。我在发布之前已经阅读过关于DISPLAY_NAME_PRIMARY的内容,但我无法找到如何检索它,我会尝试它,但如果它不适用于GB(2.3),那么我无法使用它。我简单地查询DISPLAY_NAME,并将其保存为CSV(带有其他字段),然后在还原时读取它。我说你看到了许多问题,但我想保持简单。我使用CSV来保持数据的可读性,并且需要将其同步到Dropbox而不是谷歌联系人。 – thedesolatesoul 2013-03-21 16:44:43

以下是查找重复联系人的代码。你需要传递“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; 
    }