每当我想向现有Android联系人添加新数据时,我都会使用以下函数检索给定联系人ID的所有RawContacts
ID:
protected ArrayList<Long> getRawContactID(String contact_id) {
ArrayList<Long> rawContactIDs = new ArrayList<Long>();
String[] projection = new String[] { ContactsContract.RawContacts._ID };
String where = ContactsContract.RawContacts.CONTACT_ID + " = ?";
String[] selection = new String[] { contact_id };
Cursor c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, where, selection, null);
try {
while (c.moveToNext()) {
rawContactIDs.add(c.getLong(0));
}
}
finally {
c.close();
}
return rawContactIDs;
}
之后,我只使用ContentResolver
:
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
这是针对之前找到的所有RawContacts
个ID完成的。当然,效果是重复添加所有数据。因此,我现在只想返回一个结果,但这必须满足特殊要求。
我想调整上面的功能,使其结果符合以下要求:
ContactsContract.RawContactsColumn.DELETED
必须为0 RawContacts
条目不得像Facebook的ContactsContract.SyncColumns.ACCOUNT_TYPE
最好是“com.google”。因此,如果有一个条目满足此要求,则应返回该条目。如果没有,则返回任何剩余的条目。我怎样才能(效率最高)?我不想让查询变得复杂。
答案 0 :(得分:1)
根据我对联系人的经验,以及您的需求,我已经考虑过这一点。我希望这可以帮助您解决问题,或者指出您正在寻找的方向。 请注意,我没有任何设备可用任何同步适配器,如Facebook,所以不幸的是我无法确认我的答案可行性(只读位主要可能改变为一个简单的!='')。
相同getRawContactID
功能并进行一些调整
protected ArrayList<Long> getRawContactID(String contact_id) {
HashMap<String,Long> rawContactIDs = new HashMap<String,Long>();
String[] projection = new String[] { ContactsContract.RawContacts._ID, ContactsContract.RawContacts.ACCOUNT_TYPE };
String where = ContactsContract.RawContacts.CONTACT_ID + " = ? AND " + ContactsContract.RawContacts.DELETED + " != 1 AND " + ContactsContract.RawContacts.RAW_CONTACT_IS_READ_ONLY + " != 1" ;
String[] selection = new String[] { contact_id };
Cursor c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, where, selection, null);
try {
while (c.moveToNext()) {
rawContactIDs.put(c.getString(1),c.getLong(0));
}
}
finally {
c.close();
}
return getBestRawID(rawContactIDs);
}
另一个getBestRawID
函数可以找到最适合的帐户 -
protected ArrayList<Long> getBestRawID(Map<String,Long> rawContactIDs)
{
ArrayList<Long> out = new ArrayList<Long>();
for (String key : rawContactIDs.KeySet())
{
if (key.equals("com.google"))
{
out.clear(); // might be better to seperate handling of this to another function to prevent WW3.
out.add(rawContactIDs.get(key));
return out;
} else {
out.add(rawContactIDs.get(key));
}
}
return out;
}
还要注意 - 我编写了大部分代码而没有运行/测试它。提前道歉。