Android 以编程方式将联系人添加到收藏夹 - 加星标的列不存在
Android adding contact to favorites programmatically - starred column does not exists
我一直在尝试以编程方式将一些联系人添加到收藏夹,这是通过将该特定联系人的 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);
}
您正在更新联系人的不同位置
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" = 'Joe Luis'", null);
您应该指向联系人数据字段。在这种情况下 ContactsContract.Contacts.Data
而不是 ContactsContract.CommonDataKinds
请使用此方法Set Contact to favorite
STARRED
字段是 Contacts
table 的一部分,而不是 Data
和 Phone
table 的一部分。
您可以访问 Phone.STARRED,因为对数据 table 的所有查询都支持与联系人 table 中某些字段的隐式联接,包括加星标。
这是正确的代码:
@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_NAMEs 确实会对很多触点造成伤害。
相反,您应该始终使用唯一字段 - 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);
};
我一直在尝试以编程方式将一些联系人添加到收藏夹,这是通过将该特定联系人的 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);
}
您正在更新联系人的不同位置
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" = 'Joe Luis'", null);
您应该指向联系人数据字段。在这种情况下 ContactsContract.Contacts.Data
而不是 ContactsContract.CommonDataKinds
请使用此方法Set Contact to favorite
STARRED
字段是 Contacts
table 的一部分,而不是 Data
和 Phone
table 的一部分。
您可以访问 Phone.STARRED,因为对数据 table 的所有查询都支持与联系人 table 中某些字段的隐式联接,包括加星标。
这是正确的代码:
@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_NAMEs 确实会对很多触点造成伤害。
相反,您应该始终使用唯一字段 - 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);
};