Android联系人在单个数据库查询中显示名称和电话号码?

Der*_*rek 49 android contacts contactscontract

我正在尝试从本机数据库中获取其显示名称和电话号码(任意或所有)的联系人列表.有许多方法可以通过对手机数据库的多个查询来获取此信息,但这会带来相当大的开销.

这是我一直在研究的查询,但结果却是

Uri uri                = ContactsContract.Contacts.CONTENT_URI;
String[] projection    = new String[] { ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER};
String selection       = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;
String sortOrder       = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

Cursor people          = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

int index_id    = people.getColumnIndex(ContactsContract.Contacts._ID);
int indexName   = people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

people.moveToFirst();
do {
    String _id    = people.getString(index_id);
    String name   = people.getString(indexName);
    String number = people.getString(indexNumber);
    // Do work...
} while (people.moveToNext());
Run Code Online (Sandbox Code Playgroud)

这是由此产生的错误.

E/AndroidRuntime(21549): Caused by: java.lang.IllegalArgumentException: Invalid column data1
E/AndroidRuntime(21549):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144)
E/AndroidRuntime(21549):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
E/AndroidRuntime(21549):    at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372)
E/AndroidRuntime(21549):    at android.content.ContentProviderProxy.query(ContentProviderNative.java:408)
E/AndroidRuntime(21549):    at android.content.ContentResolver.query(ContentResolver.java:264)
Run Code Online (Sandbox Code Playgroud)

思考?我相信可能需要连接才能在单个查询中获取所有列.

jam*_*pag 104

试试这段代码:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection    = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER};

Cursor people = getContentResolver().query(uri, projection, null, null, null);

int indexName = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

if(people.moveToFirst()) {
    do {
        String name   = people.getString(indexName);
        String number = people.getString(indexNumber);
        // Do work...
    } while (people.moveToNext());
}
Run Code Online (Sandbox Code Playgroud)

  • 我有2到3次接触...为什么会这样?我只想要独特的联系方式. (3认同)

tre*_*fer 14

联系人API非常棘手,并且有几个隐式连接.

如果您能负担得起时间,请阅读ContactContractContactsProvider2.

你想要什么?这些表链接如下:

  • 联系1 - *原始联系人
  • 原始联系人1 - *电话号码(数据表)

API的工作方式如下:您选择最底部的元素(电话号码)和隐式连接到最顶层的元素(联系人).

您想使用PHONE URI案例(ContactsProvider2/line 4377).这应该选择所有电话号码并加入联系人.

将PHONE uri与一些UI魔法(用于分组)相结合,请求DISPLAY_NAME和PHONE号码(DATA1?),您应该能够解决问题.

  • 自去年大型kernel.org攻击以来,android git源代码浏览器一直处于脱机状态.您仍然可以按照Android开源页面上的说明获取代码,或者您可以尝试google它,例如http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android -apps/2.0_r1/com/android/providers/contacts/ContactsProvider2.java - 我仍然希望在某些时候重新安装git接口...... (4认同)