Android 日历表事件表操作

本文详细介绍了Android平台上的日历操作,包括日历表的基础知识、用户权限、日历操作和事件表的操作。内容涵盖查询日历、添加事件、更新事件和删除事件的步骤和注意事项,强调了在操作中需考虑账户类型和权限问题,并提供了示例代码。
摘要由CSDN通过智能技术生成

Android日历操作

基础知识

内容提供程序用于存储数据,并使其可供应用访问。Android 平台提供的内容提供程序(包括日历提供程序)通常以一组基于关系型数据库模型的表格形式公开数据,表格内的每一行都是一条记录,每一列都是特定类型和含义的数据。应用和同步适配器可通过 Calendar Provider API 获得对储存用户日历数据的数据库表进行读取/写入的权限。

每个内容提供程序都会公开一个公共 URI(包装成 Uri 对象),从而对其数据集进行唯一标识。控制多个数据集(多个表)的内容提供程序会为每个数据集公开单独的 URI。所有提供程序 URI 都以字符串“content://”开头。这表示数据会受内容提供程序的控制。日历提供程序会为其每个类(表)定义 URI 常量。这些 URI 的格式为 *<class>*.CONTENT_URI。例如,Events.CONTENT_URI

image-20220526203100599

表(类) 描述
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_NAMEACCOUNT_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 ("
                        
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiyiqwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值