Android добавляет контакт в избранное программным способом - помеченный столбец не существует - PullRequest
0 голосов
/ 26 декабря 2018

Я пытался программно добавить несколько контактов в избранное, и это было сделано путем обновления значения 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 голосов
/ 27 декабря 2018

Поле STARRED является частью таблицы Contacts, а не таблиц Data not Phone.Вы можете получить доступ к Phone.STARRED, поскольку все запросы в таблицах данных поддерживают неявные объединения с некоторыми полями из таблицы контактов, включая 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);
};
0 голосов
/ 26 декабря 2018

Вы обновляете другое местоположение контактов

ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" = 'Joe Luis'", null);

Вы должны указать на поле данных Контактов.В этом случае ContactsContract.Contacts.Data не ContactsContract.CommonDataKinds

Пожалуйста, используйте этот метод Установить контакт в избранное

...