Android日历操作
基础知识
内容提供程序用于存储数据,并使其可供应用访问。Android 平台提供的内容提供程序(包括日历提供程序)通常以一组基于关系型数据库模型的表格形式公开数据,表格内的每一行都是一条记录,每一列都是特定类型和含义的数据。应用和同步适配器可通过 Calendar Provider API 获得对储存用户日历数据的数据库表进行读取/写入的权限。
每个内容提供程序都会公开一个公共 URI(包装成 Uri
对象),从而对其数据集进行唯一标识。控制多个数据集(多个表)的内容提供程序会为每个数据集公开单独的 URI。所有提供程序 URI 都以字符串“content://”开头。这表示数据会受内容提供程序的控制。日历提供程序会为其每个类(表)定义 URI 常量。这些 URI 的格式为 *<class>*.CONTENT_URI
。例如,Events.CONTENT_URI
。
表(类) | 描述 |
---|---|
CalendarContract.Calendars |
此表储存日历特定信息。此表中的每一行都包含一个日历的详细信息,例如名称、颜色、同步信息等。 |
CalendarContract.Events |
此表储存事件特定信息。此表中的每一行都包含一个事件的相关信息,例如事件的标题、地点、开始时间、结束时间等。事件可一次性发生,也可多次重复发生。参加者、提醒和扩展属性存储在单独的表内。它们各自都有一个 EVENT_ID ,用于引用 Events 表中的 _ID 。 |
CalendarContract.Instances |
此表储存每个事件实例的开始时间和结束时间。此表中的每一行都表示一个事件实例。对于一次性事件,实例与事件为 1:1 映射。对于重复事件,系统会自动生成多个行,分别对应多个事件实例。 |
CalendarContract.Attendees |
此表储存事件参加者(来宾)信息。每一行都表示事件的一位来宾。每一行会指定来宾类型,以及来宾是否参加该事件的响应。 |
CalendarContract.Reminders |
此表储存提醒/通知数据。每一行都表示事件的一个提醒。一个事件可以有多个提醒。您可以在 MAX_REMINDERS 中指定每个事件的最大提醒数量,后者由拥有给定日历的同步适配器设置。提醒需指定为在事件发生前的某个时间(分钟)发出,而且其拥有一个可决定用户提醒方式的方法。 |
用户权限
如果需要读取日历数据,需要加入READ_CALENDAR
权限。若需要对日历数据进行删改操作,需要WRITE_CALENDAR
权限:
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
日历表
CalendarContract.Calendars
表包含各日历的详细信息。应用和同步适配器均可写入以下日历列。
常量 | 描述 |
---|---|
NAME |
日历的名称。 |
CALENDAR_DISPLAY_NAME |
显示给用户时,该日历所使用的名称。 |
VISIBLE |
表示是否选择显示该日历的布尔值。值为 0 表示不应显示与该日历关联的事件。值为 1 表示应该显示与该日历关联的事件。此值会影响 CalendarContract.Instances 表中行的生成。 |
SYNC_EVENTS |
一个布尔值,表示是否应同步日历并将其事件存储在设备上。值为 0 表示不同步该日历,也不将其事件存储在设备上。值为 1 表示同步该日历的事件,并将其事件存储在设备上。 |
包括适用于所有操作的账户类型
如果您查询 Calendars.ACCOUNT_NAME
,还必须将 Calendars.ACCOUNT_TYPE
加入选定范围。原因是对于给定帐户,只有在同时指定其 ACCOUNT_NAME
和 ACCOUNT_TYPE
的情况下,才能将其视为唯一帐户。ACCOUNT_TYPE
字符串对应在 AccountManager
处注册帐户时所使用的帐户验证器。还有一种称为 ACCOUNT_TYPE_LOCAL
的特殊帐户类型,其用于未关联设备帐户的日历。ACCOUNT_TYPE_LOCAL
帐户不会进行同步。
日历操作
查询日历
原则上该操作需要在非主线程中完成。
// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
Calendars._ID, // 0
Calendars.ACCOUNT_NAME, // 1
Calendars.CALENDAR_DISPLAY_NAME, // 2
Calendars.OWNER_ACCOUNT // 3
};
// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;
// Run query
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("