Поставщик контента Android возвращает неверный идентификатор контакта - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над приложением Android, которое управляет контактами (Добавить, Обновить, Удалить)

Этот код выводит список контактов в списке

list_ct.clear();
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (cursor != null)
{
    while (cursor.moveToNext())
    {
        String id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        Cursor cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null);
        ArrayList<String> phones = new ArrayList<String>();
        while (cursor2.moveToNext())
        {
            String phoneNumber = cursor2.getString(cursor2.getColumnIndex(CommonDataKinds.Phone.NUMBER));
            phones.add(phoneNumber);
        }
        Contact ct = new Contact(id,name,phones);
        adapter.notifyDataSetChanged();
    }
}

Это списокпрослушиватель событий

lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        Contact current = (Contact)list_ct.get(position);
        Intent in=new Intent(Intent.ACTION_EDIT,Uri.parse("content://contacts/people/"+current.getId()));
        startActivityForResult(in,2);
    }
});

Когда я щелкаю по контакту в просмотре списка, для некоторых из них намерение открывается и закрывается немедленно, как если бы идентификатор не существовал в базе данных контакта, а для других он открываетсяредактирование контакта для другого контакта.

Отображаемое имя контакта и номера его телефонов отображаются правильно, но идентификатор неверен.Чего я не понимаю, так это того, почему идентификатор в первом курсоре работает для отображения телефонных номеров контакта, но не для обновления.

1 Ответ

0 голосов
/ 04 февраля 2019

Вы используете очень старый и устаревший Android API под названием «Люди» для своего URI контакта, никогда не используйте People API, всегда ContactsContract.

Вы должны создать свой контактный URI следующим образом:

Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);

Кроме того, ваш запрос очень медленный, вы можете заменить эти сотни запросов одним быстрым запросом, чтобы сделать ваше приложение быстрее и проще, см. Пример кода в этом ответе: https://stackoverflow.com/a/47788324/819355

...