Android内容提供商返回错误的联系人ID

时间:2019-02-04 13:17:07

标签: java android uri android-contentprovider android-contacts

我正在使用一个管理联系人(添加,更新,删除)的Android应用程序

这是在列表视图中列出联系人的代码

s = 'azcbobobegghakl'
substring = "bob"

for i in range(0, len(s)):
    if substring in s:
        j = 0
        count = 0
        count1 = 0
        while s[i] == substring[j]:
            count += 1
            i += 1
            j += 1
            if j > len(substring):
                break
        if count == len(substring):
            count1 += 1
            count = 0
        else:
            i += 1

print(count1)

这是列表视图事件监听器

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

当我在列表视图中单击某个联系人时,对于其中的某些而言,意图会立即打开和关闭,就好像该ID在联系人数据库中不存在一样;对于其他人,它将打开另一个联系人的联系人编辑。 / p>

可以正确显示联系人的显示名称及其电话号码,但是ID错误。我不明白的是,为什么第一个光标中的id可以显示联系人的电话号码,却无法更新。

1 个答案:

答案 0 :(得分:0)

您使用的联系人URI使用的是非常老旧的Android API(称为“ People”),请不要使用People's API,请始终使用ContactsContract。

您应该像这样构建您的联系人uri:

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

除此之外,您的查询非常慢,您可以用单个快速查询替换这数百个查询,以使您的应用程序更快,更轻松,请参见此答案中的示例代码: https://stackoverflow.com/a/47788324/819355