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 意图仅显示带有电话号码的联系人