J'ai du code pour lire les coordonnées de contact et lire les anniversaires. Mais comment puis-je obtenir une liste de contacts dans l'ordre de leur prochain anniversaire?
Pour un seul contact identifié par ID code>, je reçois des détails et un anniversaire comme ceci: p>
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;
}
5 Réponses :
Modifiez le paramètre de tri dans votre invocation de requête () dans getlist (). Actuellement, il est défini sur Display_Name. Essayez type_birthday. P>
Ce n'est pas si simple. Ces deux sont accessibles par deux fournisseurs de contenu différents. Ainsi, je ne veux pas d'ordre simple d'anniversaire, je veux l'ordre à venir, alors quelqu'un ayant anniversaire le 23 mars sera le premier et l'année prochaine février à la fin.
Peut-être que vous souhaitez utiliser un curseurJoiner comme dans la réponse suivante: http://www.mail-archive.com/androïd- développeurs@googlegroups.com/msg44317.html P>
J'ai un problème similaire que je n'ai pas encore résolu, alors j'aimerais savoir si vous pouvez obtenir cela pour travailler. P>
Cursorjoiner nécessite d'avoir les deux curseurs triés sur la jointure
Je pense que je voudrais obtenir la liste triée d'anniversaire, puis copiez cette liste dans une deuxième liste, en utilisant la date d'aujourd'hui comme "Date nulle". On dirait que ce serait plus propre de le faire de cette façon que d'essayer de marteler une requête appropriée, bien que cela puisse être une touche plus lente. P>
J'ai fini avec cette solution p>
Donc, dans la finale, j'ai fini par avoir un curseur avec des contacts ID, nom d'affichage et anniversaire de la base de données dans l'ordre que je voulais p>
J'ai fait cela l'autre chemin autour - une sélection directement à la table de données qui stocke l'anniversaire.
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;
Je me demande si cette requête retourne la date de naissance ou la date d'anniversaire? Et cela renvoie-t-il tous les prochains? Par exemple: si j'existais le 25 décembre, il retournera les personnes qui ont des antivus après le 25 et après le 1er janvier aussi?
1) Il renvoie la date d'anniversaire au format AAAA-MM-DD. Pour obtenir la date d'anniversaire, vous devez le sous-chaîner. 2) Je l'ai résolu en appelant la requête deux fois - vérifiez le code modifié.