我正在尝试检索所有联系人的显示名称和电话号码,但我希望它只返回有号码的行。
目前我喜欢这样,它的确有效:
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE");
while (cur.moveToNext())
{
if ( Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
{
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contacts[index] = name;
Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
pCur.moveToFirst();
numbers[index] = pCur.getString( pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
index++;
pCur.close();
}
事情是加载时需要4-5秒才能加载cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
400次。
现在我的理解是,联系人的姓名和号码保存在不同的表格中,您需要名称的ID才能获得该号码。
这可以更快地以其他方式完成吗?
提前致谢
答案 0 :(得分:5)
@mixkat 我已经找到了另外一个解决方案。
只需一个查询即可获取姓名和电话数据。
以下是代码:
String WHERE_CONDITION = ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'";
String[] PROJECTION = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.DATA1};
String SORT_ORDER = ContactsContract.Data.DISPLAY_NAME;
Cursor cur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
PROJECTION,
WHERE_CONDITION,
null,
SORT_ORDER);
在这种情况下,您不直接查询联系提供程序,而是查询数据提供程序。
答案 1 :(得分:1)
我有同样的问题。我通过在db第一次用户打开应用程序中保存联系人来解决它。而且我更新数据(当应用程序更新联系人时,由您决定。)
因此,应用程序使用我的db表中的联系人,其中名称和编号在一行中。这需要更少的时间。