带有异常日期的 Android CalendarContract 重复事件
Posted
技术标签:
【中文标题】带有异常日期的 Android CalendarContract 重复事件【英文标题】:Android CalendarContract recurring event with exception dates 【发布时间】:2014-06-14 01:45:11 【问题描述】:我找不到将例外日期插入重复事件的方法。
上下文
我正在解析一个带有成功事件的 .ics 文件(ical 格式)。 这是.ics
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:TESTING
X-WR-TIMEZONE:Europe/Amsterdam
X-WR-CALDESC:
BEGIN:VTIMEZONE
TZID:Europe/Amsterdam
X-LIC-LOCATION:Europe/Amsterdam
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=Europe/Amsterdam:20140425T103000
DTEND;TZID=Europe/Amsterdam:20140425T113000
RRULE:FREQ=WEEKLY;BYDAY=FR
EXDATE;TZID=Europe/Amsterdam:20140516T103000
EXDATE;TZID=Europe/Amsterdam:20140502T103000
DTSTAMP:20140425T090449Z
UID:3bb37doi3qcuaih3t03ns0q9jo@google.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=TESTIN
G;X-NUM-GUESTS=0:mailto:domain.com_o300s@group.calendar.google.com
CREATED:20140425T090310Z
DESCRIPTION:
LAST-MODIFIED:20140425T090427Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:my-recurring-event-with-ex
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
然后通过 CalendarContract API 将该事件插入到 android 日历中。
dtstart: 20140425T103000 联系人:20140425T113000 规则:FREQ=WEEKLY;BYDAY=FR
问题:排除日期
如果我现在查询我的日历,我会在 2014 年 4 月 25 日开始的每个星期五看到一个事件。
问题是我还需要排除一些日期(参见 ical:2014 年 5 月 2 日和 2014 年 5 月 16 日)
尝试 1
我尝试插入 16 的 exdate 可能只使用 EXDATE 字段,如下所示: android: EXDATE format when adding a calendar event 但这不起作用,并且基于 android 日历源代码,它甚至没有被使用。
尝试 2
我尝试使用 CONTENT_EXCEPTION_URI 插入异常 通过这样的帖子:Make exception event from original recurring event? 谷歌日历代码:https://github.com/android/platform_packages_apps_calendar/blob/master/src/com/android/calendar/EventInfoFragment.java#L1401
ContentValues values2 = new ContentValues();
values2.put(CalendarContract.Events.ORIGINAL_INSTANCE_TIME, event.getAsString(CalendarContract.Events.DTSTART));
values2.put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CANCELED);
Uri.Builder eventUriBuilder = CalendarContract.Events.CONTENT_EXCEPTION_URI.buildUpon();
eventUriBuilder.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true");
eventUriBuilder.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName);
eventUriBuilder.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType);
ContentUris.appendId(eventUriBuilder, dbId);
Uri uriex = cr.insert(eventUriBuilder.build(), values2);
uriex 始终为空。
尝试 3
我尝试插入一个带有指向其原始事件的链接的新事件,就像在谷歌日历代码中一样,用于删除重复事件的单个条目 https://github.com/android/platform_packages_apps_calendar/blob/master/src/com/android/calendar/DeleteEventHelper.java#L361
问
有人知道如何处理 CalendarContract API 以处理重复事件中的异常吗?
【问题讨论】:
【参考方案1】:我已经查询了我自己的设备日历数据库。
select _ID,exdate from events where exdate is not null
它包含例如 exdate="20090103T093000Z,20110101T093000Z" 所以日期必须格式化为 utc ("Z")
> and based on the android calendar source code it (the field exdate)
> is not event used.
当android从事件计算/更新(事件)实例时,您是否分析了开机后事件?
【讨论】:
我想我也尝试过这样添加它们。我想我将不得不再试一次。而对于第二部分,不,我没有,我主要从谷歌查看了日历应用程序的来源以上是关于带有异常日期的 Android CalendarContract 重复事件的主要内容,如果未能解决你的问题,请参考以下文章
android怎样获取第 2 3 4 5 6天的日期啊啊 啊
带有 minDate 和 maxDate 的 JQuery datetimepicker 异常日期
带有消息“SQLSTATE [22007]”的未捕获异常“PDOException”:日期时间格式无效:1366 字符串值不正确