У меня есть код, чтобы прочитать контактную информацию и считать дни рождения. Но как я получаю список контактов в порядке их предстоящего дня рождения?
Для единственного контакта, определенного id
, Я получаю детали и день рождения как это:
Cursor c = null;
try {
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, id);
c = ctx.getContentResolver().query(uri, null, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
DatabaseUtils.cursorRowToContentValues(c, data);
}
}
c.close();
// read birthday
c = ctx.getContentResolver()
.query(
Data.CONTENT_URI,
new String[] { Event.DATA },
Data.CONTACT_ID + "=" + id + " AND "
+ Data.MIMETYPE + "= '"
+ Event.CONTENT_ITEM_TYPE + "' AND "
+ Event.TYPE + "=" + Event.TYPE_BIRTHDAY,
null, Data.DISPLAY_NAME);
if (c != null) {
try {
if (c.moveToFirst()) {
this.setBirthday(c.getString(0));
}
} finally {
c.close();
}
}
return super.load(id);
} catch (Exception e) {
Log.v(TAG(), e.getMessage(), e);
e.printStackTrace();
return false;
} finally {
if (c != null)
c.close();
}
и код для чтения всех контактов:
public Cursor getList() {
// Get the base URI for the People table in the Contacts content
// provider.
Uri contacts = ContactsContract.Contacts.CONTENT_URI;
// Make the query.
ContentResolver cr = ctx.getContentResolver();
// Form an array specifying which columns to return.
String[] projection = new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME };
Cursor managedCursor = cr.query(contacts, projection, null, null,
ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC");
return managedCursor;
}
Я пришел к этому решению
, поэтому в конечном итоге я получил Cursor с идентификатором контакта, отображаемым именем и днем рождения из базы данных в том порядке, в котором я хотел.
Измените параметр sort в вашем вызове query() в getList(). В настоящее время он установлен на DISPLAY_NAME. Попробуйте использовать TYPE_BIRTHDAY.
Думаю, я получу список, отсортированный по дням рождения, затем скопирую этот список во второй список, используя сегодняшнюю дату в качестве «нулевой даты». Похоже, было бы проще сделать это таким образом, чем пытаться выработать соответствующий запрос, хотя это может быть немного медленнее.
Возможно, вы хотите использовать CursorJoiner, как в следующем ответе: http://www.mail-archive.com/android-developers@googlegroups.com/msg44317.html
У меня есть похожая проблема, которую я еще не решил, поэтому я хотел бы знать, сможете ли вы заставить это работать.