Чтение всех сегодняшних событий с помощью CalendarContract-Android 4.0+
Я пытаюсь использовать новый API календаря Android для чтения всех сегодняшних событий календаря. У меня возникли проблемы с поиском правильного выбора в запросе базы данных, чтобы вернуть все события. Кажется, что все повторяющиеся и все дневные события исключены из выборки. Какой выбор args позволит мне получить все сегодняшние события из API календаря?
вот моя текущая попытка:
Cursor cur = null;
String selection = "((" + CalendarContract.Events.DTSTART
+ " >= ?) AND (" + CalendarContract.Events.DTEND + " <= ?))";
Time t = new Time();
t.setToNow();
String dtStart = Long.toString(t.toMillis(false));
t.set(59, 59, 23, t.monthDay, t.month, t.year);
String dtEnd = Long.toString(t.toMillis(false));
String[] selectionArgs = new String[] { dtStart, dtEnd };
cur = c.getContentResolver().query(CalendarContract.Events.CONTENT_URI,
null, selection, selectionArgs, null);
Я не уверен, как расширить выбор или добавление к нему получите повторяющиеся события и события всего дня. Любая помощь будет оценена.
5 ответов
чтобы получить все события сегодня, включая повторяющиеся события, вам нужно использовать таблицу экземпляров, т. е.
Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI
.buildUpon();
ContentUris.appendId(eventsUriBuilder, timeNow);
ContentUris.appendId(eventsUriBuilder, endOfToday);
Uri eventsUri = eventsUriBuilder.build();
Cursor cursor = null;
cursor = mContext.getContentResolver().query(eventsUri, columns, null, null, CalendarContract.Instances.DTSTART + " ASC");
обратите внимание, что вы должны добавить временные ограничения к uri событий, вы не можете сортировать по-другому.
для того чтобы включить все события дня, а также расширить поиск до 11:59 вечера и 12:00 утра сегодня.
ваши условия дают вам только события, которые строго находятся в пределах сегодняшнего дня. Вы должны проверить те, что раньше начнется сегодня и закончится после (событие multidays).
для повторяющихся событий, я проверяю их вручную. Я не нашел другого пути.
Я использую что-то вроде:
String selection = "((" + CalendarContract.Events.DTSTART + " <= ?) AND (" + CalendarContract.Events.DTEND + " >= ?)) OR (" + CalendarContract.Events.RRULE + " is not null )";
String[] selectionArgs = new String[] { dtEnd, dtStart};
С уважением,
вы должны иметь возможность добавить CalendarContract.События.ALL_DAY к вашему условию выбора для фильтрации всех событий ALL_DAY.
Я знаю, что это немного поздно, но у меня был очень похожий вопрос было трудно найти ответ, который я искал. Вынужденный часовой пояс UTC для событий в течение всего дня сделал вещи сложными. Вот мое решение:
// "allDayStart" is an all-day event today, encoded in the default time zone
Time allDayStart = new Time();
allDayStart.timezone=TimeZone.getDefault().toString();
allDayStart.set(dayStart.monthDay, dayStart.month, dayStart.year);
// 2 time selections for the query:
// 1) Between day-start and day-end (not all-day); or
// 2) Equals today at 0:00:00 (all-day) in the default timezone
String calSelection =
"((" + Calendars.ACCOUNT_NAME + " = ?) " +
"AND (" + Calendars.OWNER_ACCOUNT + "= ?) " +
"AND (" +
"((" + Events.DTSTART + ">= ?) " +
"AND (" + Events.DTSTART + "<= ?) " +
"AND (" + Events.ALL_DAY + "= ?) " +
") " +
"OR ((" + Events.DTSTART + "= ?) " +
"AND (" + Events.ALL_DAY + "= ?)" +
")" +
")" +
")";
String[] calSelectionArgs = new String[] {
accountName, ownerName,
dayStartInMillis.toString(), dayEndInMillis.toString(), "0", // during today, not all day
allDayStartInMillis.toString(), "1" // Started today at default start-time for all-day events (all-day), default time zone
};
запрос может быть уточнен, чтобы не нуждаться в 2 частях, но это было достаточно хорошо для меня.
если это поможет, вот откуда пришли dayStart и dayEnd:
Time dayStart = new Time();
dayStart.setToNow();
dayStart.hour=0;
dayStart.minute=0;
dayStart.second=0;
Time dayEnd = new Time();
dayEnd.set(dayStart);
dayEnd.hour=dayStart.hour+23;
dayEnd.minute=dayStart.minute+59;
dayEnd.second=dayStart.second+59;
Long dayStartInMillis = dayStart.toMillis(false);
Long dayEndInMillis = dayEnd.toMillis(false) + 999;
Long allDayStartInMillis = allDayStart.toMillis(false);
попробуйте использовать экземпляры.CONTENT_BY_DAY_URI. Проверьте этот ответ для примера -https://stackoverflow.com/a/36622111/1219241