如何在插入新联系人时检测到重复的联系人?
对于联系人备份应用程序,我将所有信息保存到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通讯录应用之间进行同步。
以下是查找重复联系人的代码。你需要传递“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;
}
感谢您回复Joe。我在发布之前已经阅读过关于DISPLAY_NAME_PRIMARY的内容,但我无法找到如何检索它,我会尝试它,但如果它不适用于GB(2.3),那么我无法使用它。我简单地查询DISPLAY_NAME,并将其保存为CSV(带有其他字段),然后在还原时读取它。我说你看到了许多问题,但我想保持简单。我使用CSV来保持数据的可读性,并且需要将其同步到Dropbox而不是谷歌联系人。 – thedesolatesoul 2013-03-21 16:44:43