按日期游标查询顺序

Cursor query order by Date

我有一个 TextView,我要将有生日的联系人放入其中:

private String loadContacts()
{
    StringBuilder builder = new StringBuilder();
    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null,
            null, null);

    if (cursor.getCount() > 0){
        while (cursor.moveToNext()){
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            String columns[] = {
                    ContactsContract.CommonDataKinds.Event.START_DATE,
                    ContactsContract.CommonDataKinds.Event.TYPE,
                    ContactsContract.CommonDataKinds.Event.MIMETYPE,
            };

            String where = ContactsContract.CommonDataKinds.Event.TYPE + "=" +
                    ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY +
                    " and " + ContactsContract.CommonDataKinds.Event.MIMETYPE +
                    " = '" + ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE +
                    "' and " + ContactsContract.Data.CONTACT_ID + " = " + id;

            String sortOrder = ContactsContract.CommonDataKinds.Event.START_DATE + " ASC";

            Cursor birthdayCur = cr.query(ContactsContract.Data.CONTENT_URI, columns, where,
                    null, sortOrder);

            if (birthdayCur.getCount() > 0) {
                while (birthdayCur.moveToNext()) {
                    String birthday = birthdayCur.getString(birthdayCur.
                            getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));

                    builder.append("Contact: ").append(name).append(" ").append(birthday).append("\n\n");
                }
            }
            birthdayCur.close();
        }
    }
    cursor.close();

    return builder.toString();
}

然后在"onCreate"函数

上分配联系人
  if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_CONTACTS }, 1);
    } else {
        listContacts.setText(loadContacts());
    }

这行代码:

String sortOrder = ContactsContract.CommonDataKinds.Event.START_DATE + " ASC";
Cursor birthdayCur = cr.query(ContactsContract.Data.CONTENT_URI, columns, where,
                    null, sortOrder);

无论我在那里订购什么(名称、_ID 等)似乎都不起作用。

我正在尝试按生日排序,但即使我尝试按姓名排序也不起作用。为什么?

我是不是使用了错误类型的视图 (TextView),还是我使用 StringBuilder 设置文本的方式或其他完全不同的方式?

我的 minSdkVersion 是 19,targetSdkVersion 是 26。我正在我的 Nexus5(api 23 android 6.01)调试模式下测试这个应用程序。

感谢任何建议。

好吧,这就是我匆忙时发生的事情。其实很简单。 我只需要将所有需要的列放在第一个 Cursor 中,第二个更重要的是使用 "ContactsContract.Data.CONTENT_URI" 而不是 "ContactsContract.Contacts.CONTENT_URI" 因为 "DATA.CONTENT_URI" 实际上有我需要的所有列而 "Contacts.CONTENT_URI" 没有。

就这么简单。

private String loadContacts()
    {
        StringBuilder builder = new StringBuilder();
        ContentResolver cr = getContentResolver();

        String columns[] = {
                ContactsContract.CommonDataKinds.Event.START_DATE,
                ContactsContract.Contacts.DISPLAY_NAME
        };

        String where = ContactsContract.CommonDataKinds.Event.TYPE + "=" +
                ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY +
                " and " + ContactsContract.CommonDataKinds.Event.MIMETYPE +
                " = '" + ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE + "'";

        String sortOrder = ContactsContract.CommonDataKinds.Event.START_DATE + " ASC";

        Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
                columns, where,
                null, sortOrder);

        if (cursor.getCount() > 0){
            while (cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String birthday = cursor.getString(cursor.
                        getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));

                builder.append("Contact: ").append(name).append(birthday).append(" ").append("\n\n");
            }
        }
        cursor.close();

        return builder.toString();
    }