我一直在尝试以编程方式将一些联系人添加到收藏夹,这是通过将特定联系人的STARRED值从0更新为1来完成的,但是每当我执行查询时,它都会抛出SQLite exception
,让我知道STARRED列不存在。
contactsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
contentValues = new ContentValues();
contentValues.put(ContactsContract.CommonDataKinds.Phone.STARRED, 1);
getActivity().getContentResolver()
.update(ContactsContract.Data.CONTENT_URI,
contentValues,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+ " = 'Joe Luis'", null);
}
答案 0 :(得分:0)
您正在更新联系人的其他位置
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" = 'Joe Luis'", null);
您应指向“联系人”数据字段。在这种情况下,ContactsContract.Contacts.Data
不是ContactsContract.CommonDataKinds
请使用此方法Set Contact to favorite
答案 1 :(得分:0)
STARRED
字段是Contacts
表的一部分,而不是Data
而非Phone
表的一部分。
您可以访问Phone.STARRED,因为数据表上的所有查询都支持隐式联接以及Contacts表中的某些字段,包括STARRED。
这是正确的代码:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
contentValues = new ContentValues();
contentValues.put(Contacts.STARRED, 1);
getActivity().getContentResolver().update(Contacts.CONTENT_URI,
contentValues,
Phone.DISPLAY_NAME+ " = 'Joe Luis'", null);
};
但是请注意,基于非唯一项(例如显示名称)来修改联系人是一个非常糟糕的做法,因为您可能会在设备上拥有一个拥有相同名称的联系人,或者您可能会清空DISPLAY_NAME损坏了许多联系人。
相反,您应该始终使用唯一字段-Contacts._ID-来选择更新,就像这样:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
long contactId = getContactIdFromPosition(position); // you need to implement this!
contentValues = new ContentValues();
contentValues.put(Contacts.STARRED, 1);
getActivity().getContentResolver().update(Contacts.CONTENT_URI,
contentValues, Contacts._ID + "=" + contactId, null);
};