Android以编程方式将联系人添加到收藏夹-加星标的列不存在

时间:2018-12-26 15:01:38

标签: android android-contacts contactscontract

我一直在尝试以编程方式将一些联系人添加到收藏夹,这是通过将特定联系人的STARRED值从0更新为1来完成的,但是每当我执行查询时,它都会抛出SQLite exception,让我知道STARRED列不存在。

enter image description here

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);
    }

2 个答案:

答案 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);
};