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 的一部分,而不是 DataPhone 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);
};