Android Calendar Provider总结
来源:互联网 发布:vb ado控件下载 编辑:程序博客网 时间:2024/06/04 18:34
官方文档:https://developer.android.com/guide/topics/providers/calendar-provider.html
一、什么是Calendar Provider
其实是就是Android专门用于存储用户的日程与日程事件的数据库,通过读写日程与日程事件相关数据可以不需要启动自己的应用而借助于系统日历应用做一些提醒用户的操作,应用场景:还贷提醒、计划提醒、图书馆还书提醒等。
二、Calendar数据库中重要的表
1、CalendarContract.Calendars:该表的作用是每条记录存放单独的日程详情,日程可以简单理解成用户的一个计划,而事件就是这个计划的一些通知,比如提醒、有没有开始、完成了没有等。具体有如下的字段:最重要的就是ownerAccount,也叫做cal_id,因为事件的加入、提醒都需要使用这个id,可以叫做日程账户。
0 = "ownerAccount" 1 = "sync_events" 2 = "cal_sync6" 3 = "cal_sync8" 4 = "maxReminders" 5 = "canPartiallyUpdate" 6 = "_sync_id" 7 = "COALESCE(isPrimary, ownerAccount = account_name)" 8 = "allowedReminders" 9 = "_id" 10 = "calendar_timezone" 11 = "calendar_access_level" 12 = "calendar_displayName" 13 = "dirty" 14 = "cal_sync10" 15 = "calendar_color" 16 = "cal_sync3" 17 = "cal_sync9" 18 = "cal_sync1" 19 = "canOrganizerRespond" 20 = "cal_sync7" 21 = "canModifyTimeZone" 22 = "visible" 23 = "account_type" 24 = "allowedAttendeeTypes" 25 = "cal_sync2" 26 = "mutators" 27 = "calendar_location" 28 = "allowedAvailability" 29 = "calendar_color_index" 30 = "name" 31 = "cal_sync5" 32 = "deleted" 33 = "account_name" 34 = "cal_sync4"
(1)日程数据库的读写需要声明权限,代码如下:
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" />(2)新增一个日程,代码如下:
private static String CALENDARS_NAME = "Tips"; private static String CALENDARS_ACCOUNT_NAME = "TipsAccount"; private static String CALENDARS_ACCOUNT_TYPE = CalendarContract.ACCOUNT_TYPE_LOCAL; private static String CALENDARS_DISPLAY_NAME = "Hello"; public static long addNewCalendar(Context context) { TimeZone timeZone = TimeZone.getDefault(); ContentValues value = new ContentValues(); value.put(CalendarContract.Calendars.NAME, CALENDARS_NAME); value.put(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME); value.put(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE); value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CALENDARS_DISPLAY_NAME); value.put(CalendarContract.Calendars.VISIBLE, 1); value.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.BLUE); value.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER); value.put(CalendarContract.Calendars.SYNC_EVENTS, 1); value.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID()); value.put(CalendarContract.Calendars.OWNER_ACCOUNT, CALENDARS_ACCOUNT_NAME); value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0); Uri calendarUri = CalendarContract.Calendars.CONTENT_URI; calendarUri = calendarUri.buildUpon() .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, CALENDARS_ACCOUNT_NAME) .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE) .build(); Uri result = context.getContentResolver().insert(calendarUri, value); long id = result == null ? -1 : ContentUris.parseId(result); LogDebug("addNewCalendar: " + id); return id; }(3)查询日程,代码如下:
public static long queryCalendar(Context context, ContentResolver contentResolver) { long calID = -1; if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR) != PackageManager .PERMISSION_GRANTED) { return calID; } Uri uri = CalendarContract.Calendars.CONTENT_URI; Cursor cur = contentResolver.query(uri, null, null, null, null); while (cur != null && cur.moveToNext()) { calID = cur.getLong(0); String calendarTimezone = cur.getString(10); String syncEvents = cur.getString(1); String displayName = cur.getString(12); String accountName = cur.getString(33); LogDebug("queryCalendar: calID=" + calID + ",syncEvents=" + syncEvents + ",displayName=" + displayName + ",calendarTimezone=" + calendarTimezone + "," + "accountName=" + accountName); } if (cur != null) { cur.close(); } return calID; }2、CalendarContract.Events:创建了日程之后,就是各种事件提醒等操作了,为此Android专门设计了这个表来存放事件。该表的作用是每条记录存放单独的事件信息,例如事件标题、开始与结束时间等。注意一个事件可以出现一次或者重复出现。
(1)往日程新增一个事件,代码如下:
public static long addEvent(long calID, Context context, long beginTime) { LogDebug("addEvent calID:" + calID); long eventID = -1; if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager .PERMISSION_GRANTED) { return eventID; } Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeInMillis(beginTime);//设置开始时间 long start = mCalendar.getTime().getTime(); mCalendar.setTimeInMillis(start + 2 * 60 * 60 * 1000);//设置终止时间 long end = mCalendar.getTime().getTime(); ContentValues values = new ContentValues(); //必要参数 values.put(CalendarContract.Events.CALENDAR_ID, calID); //必要参数 values.put(CalendarContract.Events.EVENT_TIMEZONE, getEventTimezone()); values.put(CalendarContract.Events.DTSTART, start); //非重复事件时必须设置 values.put(CalendarContract.Events.DTEND, end); values.put(CalendarContract.Events.TITLE, "Calendar Event"); values.put(CalendarContract.Events.DESCRIPTION, "research the system calendar event"); Uri uri = context.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values); // get the event ID that is the last element in the Uri eventID = Long.parseLong(uri.getLastPathSegment()); LogDebug("eventID:" + eventID); return eventID; }(2)更新事件信息,代码如下:
public static void updateEvents(Context context, long eventID) { Calendar beginTime = getInstance(); beginTime.set(2017, 6, 21, 18, 20); long startMillis = beginTime.getTimeInMillis(); Calendar endTime = getInstance(); endTime.set(2017, 6, 21, 20, 0); long endMillis = endTime.getTimeInMillis(); ContentValues values = new ContentValues(); values.put(CalendarContract.Events.DTSTART, startMillis); values.put(CalendarContract.Events.DTEND, endMillis); // The new title for the event values.put(CalendarContract.Events.TITLE, "Kickboxing"); Uri updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID); int rows = context.getContentResolver().update(updateUri, values, null, null); LogDebug("updateEvents: " + rows); }(3)删除事件,代码如下:
public static void deleteEvents(Context context, long eventID) { ContentValues values = new ContentValues(); Uri deleteUri = null; deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID); int rows = context.getContentResolver().delete(deleteUri, null, null); LogDebug("deleteEvents: " + rows); }3、CalendarContract.Reminders:加入了事件之后,其实最关心的还是这个提醒操作,而android而专门设计了这张表来存放事件提醒的信息。代码如下:
public static void addReminders(Context context, long eventID) { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager .PERMISSION_GRANTED) { return; } ContentValues values = new ContentValues(); values.put(CalendarContract.Reminders.MINUTES, 10); values.put(CalendarContract.Reminders.EVENT_ID, eventID); values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT); Uri uri = context.getContentResolver().insert(CalendarContract.Reminders.CONTENT_URI, values); LogDebug("addReminders uri:" + uri); }4、CalendarContract.Instances:事件提醒操作能够得以保证实施,其实记录时间点是最关键的,为次android也专门设计了这个表,用于存放事件的开始与结束时间,与事件的发生次数有对应关系。一次性事件对应一条记录,重复事件对应多条记录。代码就不上了,参考官方文档即可。
5、CalendarContract.Attendees:该表的作用是存放事件的参与者信息。代码如下:
public static void addAttendees(Context context, long eventID) { ContentValues values = new ContentValues(); values.put(CalendarContract.Attendees.ATTENDEE_NAME, "Dson"); values.put(CalendarContract.Attendees.ATTENDEE_EMAIL, "dsonr@example.com"); values.put(CalendarContract.Attendees.ATTENDEE_RELATIONSHIP, CalendarContract.Attendees.RELATIONSHIP_ATTENDEE); values.put(CalendarContract.Attendees.ATTENDEE_TYPE, CalendarContract.Attendees.TYPE_OPTIONAL); values.put(CalendarContract.Attendees.ATTENDEE_STATUS, CalendarContract.Attendees.ATTENDEE_STATUS_INVITED); values.put(CalendarContract.Attendees.EVENT_ID, eventID); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager .PERMISSION_GRANTED) { return; } Uri uri = context.getContentResolver().insert(CalendarContract.Attendees.CONTENT_URI, values); LogDebug("addAttendees uri:" + uri); }
阅读全文
0 0
- Android Calendar Provider总结
- Android Calendar Provider基础
- Android API Guides---Calendar Provider
- Android Calendar Provider(日历事件)
- Calendar Provider
- Android - Calendar Provider(未完待续)
- Android官方文档之Calendar Provider
- Calendar Provider(中文版)
- ContentProvider示例-Calendar Provider
- Content Provider之Calendar And Contact Provider
- Calendar Provider 日历数据存储
- Android系统Content Provider数据库总结
- Android系统Content Provider数据库总结
- android---总结content provider的实用
- Failed to find provider info for com.android.calendar问题排除
- Android API Guides 之 App Components(13) - Content Providers - Calendar Provider
- Android中Calendar类的用法总结
- Android中Calendar类的用法总结
- pygame系列文章
- struts- ajax
- Thread方法记录
- 数据库事务流程
- imgproc模块--计算物体的凸包
- Android Calendar Provider总结
- 安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 上
- 【TypeScript】NgModule组件的介绍1
- C++ 标准库
- HTML5 CSS3 诱人的实例 : 网页加载进度条的实现,下载进度条等
- DB Usage Complete / ADB 用法大全(转自gitHub)
- 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
- SAP 参照sto订单创建外向交货BAPI
- HTML+CSS基础课程 笔记