我以相反的方式进行了此 *** 作-直接选择存储生日的数据表。
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;
}
SELECT被两次调用-从今天到12/31的一次呼叫,从01/01到今天的第二次呼叫。我限制返回的行数为10,但这不是必需的。
编辑:
我发现这不适用于所有Android手机,因为生日日期以许多不同的格式存储。因此,您必须加载所有生日(无序),对其进行解析并在内存中进行排序。#失败
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)