add event、delete event、edit event
android Calendar Provider 有兩種處理方式,google官方比較推薦使用Intent的方式去做新增、修改、刪除的處理,當然如果需要自己實作 一個行事曆可能就不太適用了。 使用Intent做行事曆的東做簡單很多,如果只是要使用基本的行事曆組成建議使用Intent新增:
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 8, 30);
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI)
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
.putExtra(Events.TITLE, "Yoga")
.putExtra(Events.DESCRIPTION, "Group class")
.putExtra(Events.EVENT_LOCATION, "The gym")
.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
.putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com");
startActivity(intent);
另一種比較麻煩需要自己續了解calendar的相關參數才有辦法去做處理 URI:content://com.android.calendar/events來做對於每一筆事件的處理 用法就像DB一樣下指令
Cursor cursor = context.getContentResolver()
.query(Uri.parse("content://com.android.calendar/events"),
new String[] { "calendar_id", "title", "description", //取得要處理的欄位
"dtstart", "dtend", "eventLocation"}, null,
null, null);
cursor.moveToFirst();
新增:
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, mTitle);
values.put(Events.DESCRIPTION, mDiscriber);
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "Taiwan/Taipei");
values.put(Events.EVENT_LOCATION, mLocation);
AsyncQueryHandler handler = new MyHandler(getContentResolver()); //搭配AsyncQueryHandler
handler.startInsert(0, null, Events.CONTENT_URI, values);
需要搭配AsyncQueryHandler來做新增
/**
* AsyncQueryHandler
*/
public class MyHandler extends AsyncQueryHandler {
public MyHandler(ContentResolver cr) {
super(cr);
}
}
修改:
values.put(Events.TITLE, mTitle);//需要更改的欄位及更改後的值 {values.put(Events.欄位, 更改後的值);}
Uri updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, Event_ID); //Event_ID為要修改事件的Event_id
getContentResolver().update(updateUri, values, null, null);
刪除:
Uri deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, Event_ID);//Event_ID為要刪除事件的Event_id
getApplication().getContentResolver().delete(deleteUri, null, null);
若是再深層一點的處理,例如要新增自己的Owner
URI:content://com.android.calendar/calendars則是做對於每一種類的資料表做處理
新增:必須搭配Sync Adapters來做同步的動作
/**
* Sync Adapters 搭配創建一個新的Calendars資料表
* @return
*/
private static Uri buildCalUri() {
return CAL_URI
.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, "Neo_Hu@huanuage.com")
.appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE,CalendarContract.ACCOUNT_TYPE_LOCAL)
.build();
}
然後放上新的Calendars的資料
/**
* 新的Calendars的基本資料
* @return
*/
private static ContentValues buildNewCalContentValues() {
final ContentValues cv = new ContentValues();
cv.put(CalendarContract.Calendars.ACCOUNT_NAME, "Neo_Hu@huanuage.com");
cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
cv.put(CalendarContract.Calendars.NAME, "Huanauge");
cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "Huanuage行事曆");
cv.put(CalendarContract.Calendars.CALENDAR_COLOR, 0xEA8561);
cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_EDITOR);
// cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_READ);//使用者無法編輯
cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, "Neo_Hu@huanuage.com");
cv.put(CalendarContract.Calendars.VISIBLE, 1);//是否顯示
cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);//是否要再裝置上同步
return cv;
}
最後放上執行的code即可
ContentResolver cr = getContentResolver();
final ContentValues cv = buildNewCalContentValues();
Uri calUri = buildCalUri();
//insert the calendar into the database
cr.insert(calUri, cv);
刪除:
//刪除Calendars資料表事件所屬種類ID = 6 的資料
/*
Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, 6);
getApplication().getContentResolver().delete(deleteUri, null, null);
*/
修改
//將Calendars資料表內 ID = 6 的資料改成4
/*
ContentValues values = new ContentValues();
Uri updateUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, 6);
values.put(CalendarContract.Calendars._ID , 4 );//將事件所屬種類ID = 6的資料改成4
getContentResolver().update(updateUri, values, null, null);
cursor.moveToNext();
*/
基本的操作大概就這樣,可以下載DEMO試試看 http://archive1.derekbekoe.com/blog/item/16-using-the-android-4-0-calendar-api.html 這一篇也寫得滿詳細的,大家也可以參考看看。 有問題也歡迎來信hu.yu.huei@gmail.com