2013-03-20 94 views
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; 
    } 

UPDATE: 我試圖與具有相同的結果DISPLAY_NAME_PRIMARY。

但是我注意到,如果我在同一個設備/仿真器上創建聯繫人,當我重新恢復相同的聯繫人時,檢測到重複。 在穿越設備時,似乎有一個原因是不起作用的,那就是在某些時候特殊字符被刪除。 例如從CSV讀取顯示名稱「John.Doe」,但當它被插入時,它變成「John Doe」。我看不到代碼中的「。」。被剝奪了。

回答

1

發生什麼取決於設備運行的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

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; 
    } 
相關問題