android内容提供商返回错误的联系人id

63lcw9qa  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(383)

我正在开发一个android应用程序来管理联系人(添加、更新、删除)
这是在listview中列出联系人的代码

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

这是listview事件侦听器

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

当我在listview中单击一个联系人时,对于其中一些人,意图会立即打开和关闭,就好像该id不存在于联系人的数据库中一样,对于其他人,它会打开另一个联系人的联系人编辑。
联系人显示名称及其电话号码显示正确,但id错误。我不明白的是,为什么第一个光标中的id用于显示联系人的电话号码,但不用于更新。

gmxoilav

gmxoilav1#

你的联系人uri使用了一个非常旧且不推荐使用的android api,名为“people”,从不使用people's api,总是contacts contract。
您应该像这样构建联系人uri: Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 除此之外,您的查询速度非常慢,您可以用一个快速查询替换这数百个查询,以使您的应用程序更快、更轻松,请参见以下答案中的示例代码:https://stackoverflow.com/a/47788324/819355

相关问题