Frage

Ich habe Code Kontaktdaten zu lesen und Geburtstage zu lesen. Aber wie bekomme ich eine Liste der Kontakte in der Reihenfolge ihrer bevorstehenden Geburtstag?

Für einen Kontakt von id identifiziert, erhalte ich Details und Geburtstag wie folgt aus:

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();
  }

und der Code alle Kontakte zu lesen ist:

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;
    }
War es hilfreich?

Lösung

Ich tat dies umgekehrt -. Eine Auswahl direkt in der Datentabelle, die speichert Geburtstag

private static final int UPCOMING_COUNT = 10;


public static List<BContact> upcomingBirthday(Context ctx) {
    String today = new SimpleDateFormat("MM-dd").format(new Date());        
    List<BContact> firstPart = upcomingBirthday(ctx, today, "12-31", UPCOMING_COUNT);
    if (firstPart.size() < UPCOMING_COUNT) {
        firstPart.addAll(upcomingBirthday(ctx, "01-01", today, UPCOMING_COUNT - firstPart.size()));
    }
    return firstPart;
}


public static List<BContact> upcomingBirthday(Context ctx, String fromDate, String toDate, int rows) {

  Uri dataUri = ContactsContract.Data.CONTENT_URI;

  String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME,                         
            ContactsContract.CommonDataKinds.Event.CONTACT_ID,
            ContactsContract.CommonDataKinds.Event.START_DATE
            };


  Cursor c = ctx.getContentResolver().query(
       dataUri,
       projection, 
       ContactsContract.Data.MIMETYPE + "= ? AND " + 
       ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY + 
       " AND substr(" + ContactsContract.CommonDataKinds.Event.START_DATE + ",6) >= ?" + 
       " AND substr(" + ContactsContract.CommonDataKinds.Event.START_DATE + ",6) <= ?" ,
       new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, fromDate, toDate}, 
       "substr("+ ContactsContract.CommonDataKinds.Event.START_DATE +",6)");
  List<BContact> result = new ArrayList<BContact>();
  int i=0;
  while (c.moveToNext() && i<rows) {
      result.add(new BContact(c.getString(0), c.getString(1), c.getString(2)));
      i++;
  }
  c.close();
  return result;

}

Die SELECT wird zweimal aufgerufen - ein Anruf von heute bis 12/31 und zweiten Anruf von 01/01 bis heute. Ich beschränke zurückgegebenen Zeilen zu 10, aber dies ist nicht necesarry.

EDIT: Ich fand, dass dies nicht funktionieren werden auf allen Android-Handys wie Geburtsdatum in vielen anderen Format gespeichert werden. So können Sie alle Geburtstage laden müssen (ungeordnete), analysieren sie und sortieren sie in Erinnerung. #FAIL

Andere Tipps

Ich glaube, ich würde die Liste erhalten, indem Geburtstag sortierte, kopieren Sie dann diese Liste in eine zweite Liste, die heutigen Datum als mit „Null-Datum.“ Scheint, wie es sauberer, es zu tun auf diese Weise sein würde, als zu versuchen, eine entsprechende Abfrage zu hämmern, obwohl es einen Hauch langsamer sein könnte.

ich mit dieser Lösung endete

  • eine Daten Inhaber Tabelle erstellt in meine SQLite-Datenbank zu halten, Kontakt-ID, Name, Geburtsdatum Datum
  • lesen Sie Kontakte, die Geburtstag-Set haben
  • Legen Sie die Kontakte mit Geburtstag in Tabelle
  • gibt einen Cursor, die eine rawQuery tut, wenn der aktuelle Geburtstag im SQL
  • berechnet wird

so im Finale landete ich einen Cursor mit Kontakten ID mit, Anzeigenamen und Geburtstag aus der Datenbank in der Reihenfolge Ich wollte

Vielleicht möchten Sie eine CursorJoiner wie in der folgenden Antwort verwenden: http://www.mail-archive.com/android- developers@googlegroups.com/msg44317.html

Ich habe ein ähnliches Problem, das ich noch nicht gelöst haben, so würde ich gerne wissen, ob Sie diese an der Arbeit bekommen können.

Ändern der Sortierparameter in Ihrem Aufruf von query () in getList (). Derzeit ist es auf DISPLAY_NAME gesetzt. Versuchen Sie TYPE_BIRTHDAY.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top