Android 插入新触点时如何检测重复触点?
对于联系人备份应用程序,我将所有信息保存到CSV文件中,然后需要将其还原回来。它工作得很好,但是如果我按两次restore,它会复制所有联系人 我尝试了以下代码来删除重复项,它确实可以工作,但在某些情况下失败。 基本上,当没有明确的显示名称时,它会失败,例如,如果联系人似乎只有一个电话号码,而显示名称就是电话号码,或者电子邮件地址也是如此。我无法理解为什么它不能始终工作,因为显示名称字段似乎包含电话号码/电子邮件地址 以下是我使用的代码:Android 插入新触点时如何检测重复触点?,android,Android,对于联系人备份应用程序,我将所有信息保存到CSV文件中,然后需要将其还原回来。它工作得很好,但是如果我按两次restore,它会复制所有联系人 我尝试了以下代码来删除重复项,它确实可以工作,但在某些情况下失败。 基本上,当没有明确的显示名称时,它会失败,例如,如果联系人似乎只有一个电话号码,而显示名称就是电话号码,或者电子邮件地址也是如此。我无法理解为什么它不能始终工作,因为显示名称字段似乎包含电话号码/电子邮件地址 以下是我使用的代码: private boolean contactExist
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;
}
private boolean contactExists(字符串displayname、字符串emailstring、字符串phonestring){
游标crsr=BA.applicationContext.getContentResolver().query(
Contacts contract.Contacts.CONTENT\u URI,
新字符串[]{“display_name”,“_id”},
“显示名称=?”,
新字符串[]{displayname},
无效);
while(crsr.moveToNext()){
HashMap m=新的HashMap();
for(int col=0;col
更新:
我尝试了DISPLAY_NAME_PRIMARY,结果相同
然而,我注意到,如果我在同一设备/模拟器上创建联系人,当我重新恢复相同的联系人时,会检测到重复的联系人。
在跨越设备时,它不起作用的一个原因似乎是在某个时候特殊字符被删除了。
例如,显示名称“John.Doe”是从CSV读取的,但当它被插入时,它会变成“John Doe”。我看不出代码中的“.”是从哪里去掉的。发生了什么取决于设备运行的Android版本。如果版本为Honeycous(3.0)或更高版本,则联系人将始终具有名称。姓名字段是DISPLAY_name_PRIMARY,如果任何原始联系人中没有姓名,则该字段将设置为电话号码或电子邮件地址 很难确切地知道你的代码是怎么回事,因为我不知道你是如何调用ContactExistence的。但我的猜测是,您正在查看DISPLAY\u NAME,而您可能想查看DISPLAY\u NAME\u PRIMARY
作为旁白,你在这里试图做的事充满了危险。联系人提供商是一个复杂的系统,将其备份到CSV可能会导致很多问题。更好的策略是在联系人提供商和基于云的谷歌联系人应用程序之间运行同步 发生的情况取决于设备运行的Android版本。如果版本为Honeycous(3.0)或更高版本,则联系人将始终具有名称。姓名字段是DISPLAY_name_PRIMARY,如果任何原始联系人中没有姓名,则该字段将设置为电话号码或电子邮件地址 很难确切地知道你的代码是怎么回事,因为我不知道你是如何调用ContactExistence的。但我的猜测是,您正在查看DISPLAY\u NAME,而您可能想查看DISPLAY\u NAME\u PRIMARY
作为旁白,你在这里试图做的事充满了危险。联系人提供商是一个复杂的系统,将其备份到CSV可能会导致很多问题。更好的策略是在联系人提供商和基于云的谷歌联系人应用程序之间运行同步 以下是查找重复联系人的代码。您需要将“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;
}
这是找到重复联系人的代码。您需要将“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;
}
谢谢你回复乔。在发布之前,我确实读过关于DISPLAY\u NAME\u PRIMARY的内容,但是我找不到如何检索它,我会尝试一下,但是如果它在GB(2.3)上不起作用,那么我就不能使用它。我只需查询DISPLAY_名称并将其保存到CSV(与其他字段一起),然后在恢复时重新读取它。正如你所说,我确实看到了许多问题,但我想保持简单。我使用CSV来保持数据的可读性,它需要同步到Dropbox而不是google contacts。谢谢你回复Joe。在发布之前,我确实读过关于DISPLAY\u NAME\u PRIMARY的内容,但是我找不到如何检索它,我会尝试一下,但是如果它在GB(2.3)上不起作用,那么我就不能使用它。我只需查询DISPLAY_名称并将其保存到CSV(与其他字段一起),然后在恢复时重新读取它。正如你所说,我确实看到了许多问题,但我想保持简单。我使用CSV来保持数据的可读性,它需要同步到Dropbox而不是google contacts。