Calendar Provider 如何存储无限重复事件的实例?

How does Calendar Provider store instances of infinitely repeating Events?

Calendar Provider 中有多个数据 table,有事件 table,它存储各个事件的详细信息,还有实例 table,它存储每次事件发生的开始和结束时间。

我的问题是:

实例 table 中的具体事件是如何存储的,比如如果事件每天都在重复,table 如何存储事件的每次事件?它需要 table 中无限多的行,而且这不会需要很多存储空间 space 吗?一年中每天重复的事件在 table 中将有 365 个条目,那么存储事件的每一次发生不是一种浪费吗?

当您创建没有结束日期的周期性活动时,提供商会将其扩展以填充您的日历至少一年。如果您向下滚动日历超过一年,它会将事件扩展到最后一次查看的日期。

是的,理论上效率很低,但在实践中并没有那么糟糕。在我的测试中,安排了大约 5 年的每日活动占用了大约 150KB 的数据库大小(1858 行)。每周事件 - 30 KB(266 行)。

即使在低端设备上,这对于具有索引的规范化数据库也不是问题。

日历的一般工作方式基于所谓的 RRule(重复规则)(RFC-5545) ICalendar 规范。

https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html

https://developer.android.com/reference/android/provider/CalendarContract.EventsColumns#RRULE

RRULE 允许将重复发生的事件存储为单个事件。否则就像你说的那样,会很耗资源。

RRule 看起来像这样:

"FREQ=MONTHLY;BYMONTH=1,3,5,7;BYMONTHDAY=4,8,12;COUNT=20"

给定 RRule 和日期范围,您可以计算所述日期范围之间的日历事件实例。

我不确定日历提供程序对实例数据库做了什么,但可能只是为了缓存该计算。