从 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 读取生日,无效列的主要内容,如果未能解决你的问题,请参考以下文章

从触发器调用过程以验证生日

c#从数据库中读取图片出现参数无效

c#从数据库中读取图片出现参数无效

试图从数组中读取无效数据

从提供程序读取数据时发生错误。根据验证程序,远程证书无效

centos 7:nginx 无法从文件 /run/nginx.pid 读取 PID:无效参数