sqlite android提取带有电话号码的联系人

Posted

技术标签:

【中文标题】sqlite android提取带有电话号码的联系人【英文标题】:sqlite android extract contacts with phone number 【发布时间】:2015-08-12 18:05:51 【问题描述】:

我正面临这个 sqlite 问题,我试图通过以下查询提取具有电话号码的联系人:

Cursor cursor = context.getContentResolver().
    query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[]
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_URI
            ,
            ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?",
            new String [] "0",
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"
    );

问题在于,如果联系人有超过 1 个电话号码,结果将采用以下形式:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0800 000 000
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0900 000 000

由于重复数据,这是不可取的。

我只想对数据库进行 1 次查询,希望可以编写该查询以返回如下结果:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000, 0800 000 000, 0900 000 000

有可能吗?

谢谢。

【问题讨论】:

我不认为它可能是 android db 的设置方式。将其放入列表并手动将它们与循环或其他东西合并是不可能的吗?我知道这可能不是一个好方法,但我想不出更好的方法。 它需要处理成千上万的联系人,我想避免做额外的处理。 我不了解android,但这在SQL 中并不太难。您可以对您的数据库运行原始 SQL 查询,还是仅限于使用该查询功能? 我只能使用该方法或任何其他将 Uri 作为参数的方法:ContactsContract.CommonDataKinds.Phone.CONTENT_URI,这将查询手机的数据库。我不能使用原始查询。 【参考方案1】:

我不认为你想做什么,这是使用 HashMap 的一种解决方法。它可以处理数千个条目,所以不用担心。

    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.Contacts.PHOTO_URI ,
            ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?",
            new String [] "0",
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");

    Map<String, List<String>> phonesPerContact = new HashMap<>();
    if (cursor.moveToFirst()) 
        do 
            String name = cursor.getString(2);
            String phone = cursor.getString(1);

            if (!phonesPerContact.containsKey(name))
                phonesPerContact.put(name, new ArrayList<String>());
            

            phonesPerContact.get(name).add(phone);
         while (cursor.moveToNext());
    

    for (String name: phonesPerContact.keySet())
        //Do whatever you want with the contact and its list of phones

        List<String> phones = phonesPerContact.get(name);
        Log.i("test", "Name: " + name + ", Numbers: " + phones.toString());
    

【讨论】:

感谢您尝试一下(+1),我将不得不看看我最终会选择什么实现。

以上是关于sqlite android提取带有电话号码的联系人的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 设备中使用 ACTION_PICK 意图仅显示带有电话号码的联系人

使用带有联系人电话号码的自动完成文本视图

Xamarin Android,使用带有选择和选择参数的 CursorLoader 获取联系人手机号码

Android - 无法获取某些联系人的电话号码

带有复选框的 Android 联系人选择器

Android 联系人查询获取重复项