对于联系人备份应用程序,我将所有信息保存到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”。我无法在代码中看到“。”被剥夺了。
答案 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;
}