Как получить контакты в порядке их предстоящих дней рождения?

У меня есть код, чтобы прочитать контактную информацию и считать дни рождения. Но как я получаю список контактов в порядке их предстоящего дня рождения?

Для единственного контакта, определенного 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;
    }
7
задан Jesse Beder 21 March 2010 в 03:46
поделиться

4 ответа

Я пришел к этому решению

  • создал таблицу держателя данных в моей базе данных SQLite для хранения идентификатора контакта, имени, даты рождения
  • чтения контактов, для которых установлен день рождения
  • , вставьте контакты с днем ​​рождения в таблицу
  • возвращают Cursor, который выполняет rawQuery, когда текущий день рождения вычисляется в SQL

, поэтому в конечном итоге я получил Cursor с идентификатором контакта, отображаемым именем и днем ​​рождения из базы данных в том порядке, в котором я хотел.

1
ответ дан 7 December 2019 в 18:42
поделиться

Измените параметр sort в вашем вызове query() в getList(). В настоящее время он установлен на DISPLAY_NAME. Попробуйте использовать TYPE_BIRTHDAY.

-1
ответ дан 7 December 2019 в 18:42
поделиться

Думаю, я получу список, отсортированный по дням рождения, затем скопирую этот список во второй список, используя сегодняшнюю дату в качестве «нулевой даты». Похоже, было бы проще сделать это таким образом, чем пытаться выработать соответствующий запрос, хотя это может быть немного медленнее.

1
ответ дан 7 December 2019 в 18:42
поделиться

Возможно, вы хотите использовать CursorJoiner, как в следующем ответе: http://www.mail-archive.com/android-developers@googlegroups.com/msg44317.html

У меня есть похожая проблема, которую я еще не решил, поэтому я хотел бы знать, сможете ли вы заставить это работать.

0
ответ дан 7 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: