从 ContactProvider 读取生日,无效列
Posted
技术标签:
【中文标题】从 ContactProvider 读取生日,无效列【英文标题】:Reading birthday from ContactProvider, invalid column 【发布时间】:2016-11-16 03:08:07 【问题描述】:我正在做一些测试,以了解提供者如何处理事件等。
我正在尝试获取特定帐户的所有联系人,然后阅读每个联系人的详细信息以获取生日(如果存在)。
我首先尝试一次性完成,但我对提供者的了解不够,所以我尝试分两步完成,以了解是否可以完成。
我在这一行得到 Invalid column: 光标 cursor = cr.query(uri, projection, [...] contact_id 是这里的问题。如何改进第二个查询以获取我想要的数据?我在代码上尝试了各种 mod,但无济于事。
谢谢。
我使用的代码:
private void readContacts()
Cursor contByAccCursor = getContactsByAccounts();
getContactsBirthdays(contByAccCursor);
private Cursor getContactsByAccounts()
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
String[] projection = new String[]
ContactsContract.RawContacts.CONTACT_ID,
ContactsContract.RawContacts.ACCOUNT_TYPE
;
String where = ContactsContract.RawContacts.ACCOUNT_TYPE + " IN ('com.google', 'vnd.sec.contact.phone', 'com.skype.contacts.sync')";
return activity.getContentResolver().query(uri,
projection,
where,
null,
null);
private void getContactsBirthdays(Cursor filteredContacts)
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[]
//ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.CommonDataKinds.Event.CONTACT_ID,
ContactsContract.CommonDataKinds.Event.START_DATE
;
String where =
ContactsContract.Data.MIMETYPE + "= ? AND " +
ContactsContract.CommonDataKinds.Event.TYPE + "=" +
ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY + " AND " +
ContactsContract.CommonDataKinds.Event.CONTACT_ID + "= ?";
String[] selectionArgs;
String sortOrder = null;
StringBuffer sb = new StringBuffer();
ContentResolver cr = activity.getContentResolver();
int accTypeCol = filteredContacts.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE);
while(filteredContacts.moveToNext())
selectionArgs = new String[]
ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE,
filteredContacts.getString(filteredContacts.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID))
;
Cursor cursor = cr.query(uri,
projection,
where,
selectionArgs,
sortOrder);
if(cursor.moveToNext())
String dName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
String bDay = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));
String accType = filteredContacts.getString(accTypeCol);
sb.append(dName + "("+accType+")" + " - " + bDay);
sb.append("\n");
Log.d(TAG, sb.toString());
【问题讨论】:
【参考方案1】:好吧,我现在觉得很愚蠢。错误是第二个content_uri,我弄错了,一定是累了……
这是获取正确数据的正确 uri:
private void getContactsBirthdays(Cursor filteredContacts)
Uri uri = ContactsContract.Data.CONTENT_URI;
【讨论】:
以上是关于从 ContactProvider 读取生日,无效列的主要内容,如果未能解决你的问题,请参考以下文章