我需要在创建新联系人后存储联系人ID值,以便能够在其他时刻引用它。例如,我创建了一个新联系人,之后我想从其联系人ID中删除它,因此我需要在创建新联系人后检索联系人ID值。这就是我创建新联系人的方式:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, tipoCuenta).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, cuenta).build());
//Insert some data here....
c.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
//Here, I want to retrieve contact id
我该怎么做?
答案 0 :(得分:7)
ContentResolver.applyBatch()方法返回ContentProviderResult个对象的数组,每个操作一个。其中每个都有插入联系人的uri(格式为content://com.android.contacts/raw_contacts/<contact_id>
)。
因此,要获得联系人的ID,您只需要解析这个uri,即
ContentProviderResult[] results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
int contactId = Integer.parseInt(results[0].uri.getLastPathSegment());
答案 1 :(得分:1)
改善matiash答案:
ContentResolver.applyBatch()方法返回ContentProviderResult个对象的数组,每个操作一个。如果您的第一个操作添加了RawContact,那么结果数组的第一个元素将包含uri以添加RawContact(格式为content://com.android.contacts/raw_contacts/ [raw_contact_id])。
如果您对raw_contact_id感兴趣,那么以下就足够了:
final ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
long rawContactId = ContentUris.parseId(results[0].uri);
但某些设备上的raw_contact_id可能与contact_id不同 - 为了获取contact_id,您必须执行以下操作:
final ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
final String[] projection = new String[] { ContactsContract.RawContacts.CONTACT_ID };
final Cursor cursor = contentResolver.query(results[0].uri, projection, null, null, null);
cursor.moveToNext();
long contactId = cursor.getLong(0);
cursor.close();
答案 2 :(得分:0)
这里是我使用的代码片段
newContactUri = null;
try {
ContentProviderResult[] res = globalContext.getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
if (res != null && res[0] != null) {
newContactUri = res[0].uri;
/**
* als Ergebnis erhaelt man eine URI, mit der man die raw
* contact-id auslesen kann.
*/
if (debug) {
Log.d(TAG, "URI added contact:" + res[0].uri.toString()
+ " l: " + res.length);
}
subQuery(newContactUri); // setzt contactRawID
} else if (debug)
Log.e( ....);
} catch (Exception e) {
if (debug)
Log.d( .... );
}
这是子程序subQuery
/**
* <pre>
* nachdem ein user angelegt ist, wird damit
* die contactRawID gesetzt
*
* @param contactUri
* ... Ergebnis aus ContentProviderResult
* @return void
* </pre>
*/
public void subQuery(Uri contactUri) {
if (debug)
Log.i(TAG, "subQuery() ");
contactRawID = -2;
// Content Resolver
String contactIdString = null;
String displayName = null;
ContentResolver contentResolver = globalContext.getContentResolver();
String[] mainQueryProjection = { ContactsContract.RawContacts._ID,
ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY };
Cursor subQueryCursor = contentResolver.query(contactUri,
mainQueryProjection, null, null, null);
if (subQueryCursor != null) {
if (debug)
Log.d(TAG, "subQueryCursor != null ");
while (subQueryCursor.moveToNext()) {
contactIdString = subQueryCursor.getString(0);
displayName = subQueryCursor.getString(1);
}
;
try {
subQueryCursor.close();
} catch (Exception e) {
if (debug)
Log.d(TAG, .... );
}
contactRawID = Integer.parseInt(contactIdString);
}
return;
}
很抱歉德国评论文本 但我希望这有点帮助