Android 联系人在单个数据库查询中显示姓名和电话号码?
我正在尝试从本机数据库获取联系人列表及其显示名称和电话号码(任何或全部)。有许多方法可以通过多次查询手机数据库来获取此信息,但这会带来相当大的开销。
这是我一直在处理的查询,但它会导致
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());
以下是生成的错误。
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)
想法?我相信可能需要连接才能获取单个查询中的所有列。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
试试这个代码:
Try this code:
联系人 API 非常棘手,并且有多个隐式连接。
阅读 ContactContract 和 ContactsProvider2(如果您有时间的话)。
你想要什么?这些表的链接方式如下:
API 的工作方式如下:您选择最底部的元素(电话号码)并隐式连接到最顶部元素(接触)。
您想要使用 PHONE URI 大小写(ContactsProvider2 / 第 4377 行)。这应该选择所有电话号码并加入该联系人。
将 PHONE uri 与一些 UI 魔法(用于分组)结合起来,请求 DISPLAY_NAME 和电话号码(DATA1?),您应该能够解决问题。
The contacts API is extremly tricky and has several implicit joins.
Read the ContactContract and ContactsProvider2 if you can afford the time.
What do you want? The tables are chained like this:
The API works like this: you select the bottom-most element (a phone number) and implicit join to the topmost element (contact).
You want to use the PHONE URI case (ContactsProvider2 / line 4377). This should select all phone numbers and join up to the contact.
Combine the PHONE uri with some UI magic (for grouping), request the DISPLAY_NAME and the PHONE number (DATA1?) and you should be able to solve the problem.
电话号码存储在自己的表中,需要单独查询。要查询电话号码表,请使用 SDK 变量 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中存储的 URI。使用 WHERE 条件获取指定联系人的电话号码。
对 Android 联系人 SQLite 数据库执行第二次查询。根据 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中存储的 URI 查询电话号码。联系人 ID 作为 ContactsContract.CommonDataKinds.Phone.CONTACT_ID 存储在电话表中,并且 WHERE 子句用于限制返回的数据。
Phone numbers are stored in their own table and need to be queried separately. To query the phone number table use the URI stored in the SDK variable ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Use a WHERE conditional to get the phone numbers for the specified contact.
Perform a second query against the Android contacts SQLite database. The phone numbers are queried against the URI stored in ContactsContract.CommonDataKinds.Phone.CONTENT_URI. The contact ID is stored in the phone table as ContactsContract.CommonDataKinds.Phone.CONTACT_ID and the WHERE clause is used to limit the data returned.