如何更新联系人的显示名称?下面的代码中的操作完成而没有抛出任何东西并且似乎工作 - 也就是说,当我重新查询ContactsContract.Contact表时,一行返回并更改了名称。但是,当我尝试在平板电脑上运行股票“人”应用程序时,它崩溃了。显然我做错了。
这是代码。在早期,它从聚合联系人中获取一个id,如下所示,其中 key 是lookup_key:
String[] projection = new String[] {
Contacts._ID, // 0
Contacts.DISPLAY_NAME, // 1
};
Uri uri = Uri.parse (Contacts.CONTENT_LOOKUP_URI + "/" + key);
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query (uri, projection, null, null, null);
if (!cursor.moveToNext()) // move to first (and only) row.
throw new IllegalStateException ("contact no longer exists for key");
origId = cursor.getLong(0);
cursor.close();
然后,在用户完成编辑后,我调用此代码块来更新display_name:
ArrayList<ContentProviderOperation> opers = new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder builder = null;
String[] args = { Long.toString (origId) };
builder = ContentProviderOperation.newUpdate (Data.CONTENT_URI);
builder.withSelection (RawContacts.CONTACT_ID + "=?", args);
builder.withValue(CommonDataKinds.StructuredName.DISPLAY_NAME, name);
opers.add(builder.build());
ContentProviderResult[] results = null;
try {
results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, opers);
} catch ...
我意识到这个例子我不需要ContentProviderOperation;这是我以后有更多东西需要更新的时候。
说实话,我对我实际使用的ID感到困惑。这些名字对我来说并不清楚,我可能会使用错误的ID进行此操作。
对于它的价值,在更新后查看结果我看到结果代码为5.我找不到任何文档,所以不知道这是否重要。
答案 0 :(得分:5)
ID(以及通常改变的联系人)可能会让人感到困惑......我也有一些戏剧让我的头脑也围绕着他们。
以下是我用于更新的一些工作代码。我能看到的主要区别是你如何声明原始ID;它需要作为内容值包含在内。
Cursor cursor = _context.getContentResolver().query(contactUri,
new String[] { Contacts._ID }, null, null, null);
try {
if (cursor.moveToFirst()) {
String rawContactId = cursor.getString(0);
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ContentValues contentValues = new ContentValues();
contentValues.put(Data.RAW_CONTACT_ID, rawContactId);
contentValues
.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
contentValues.put(
ContactsContract.CommonDataKinds.Phone.NUMBER,
phoneNumber);
contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValues(contentValues).build());
String contactId = contactUri.getLastPathSegment();
ops.add(ContentProviderOperation
.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(
ContactsContract.Data.CONTACT_ID
+ "=? AND "
+ ContactsContract.Data.MIMETYPE
+ "=?",
new String[] {
contactId,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE })
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
newName).build());
result = _context.getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops);
}
} finally {
cursor.close();
}
希望它有所帮助!
答案 1 :(得分:0)
上面的答案通常是正确的。但是,当我插入
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
然后尝试做newUpdate
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
使用上面的代码 - 它在联系人应用程序中显示联系人,其中包含旧数据和新数据的名称。我发现插入和更新ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME
例如按照我的预期工作。在我的Android 4x上的联系人应用中编辑联系人时,我看不到家人并单独给出,请关注我DISPLAY_NAME是由Android制作的。