2011-04-14

Google Calendar API 使用.net for C#(四) --新增、修改、刪除之批次處理

Calendar API 之批次處理

之前的章節已經做過大部份的介紹了,如還不太清楚或是沒看過的人請點選先前的篇幅,這裡就不再重覆了,進入重頭戲,最前的篇幅都沒有說到修改、刪除,只有第三篇有大概說到新增,這樣以控制日曆來說好像不太夠,因為要修改或刪除必須先找到該筆資料,所以在找尋方面會比較複雜一點,不像新增那麼容易,此篇就為您介紹最重要也是比較複雜的修改及刪除,而且是用批次處理的方式,我們開始往下看。



直接設定好UI介面:
找尋標題就是要找日曆上活動的標題,這才能修改

UI做好後開始CODE後面的程式碼:


更新事件開始:


帳密認證



























找尋標題






















下面這個圖是重點,後面會有說明:


說明:
AtomId ID_edit = new AtomId();是後面feed_Edit.Entries.FindById轉換要用的
因為該筆活動在Google都是用26個英文+數字的亂碼在代表的:
str_EventId=mfl8vabke7hcp2kj1hupbf13ao,所以必須經過轉換才能找到該筆活動


ID_edit.Uri = calendarURI + str_EventId;寫入該活動的路徑

                                                              
                                                                                    



                                                                                       (該日曆ID)
ID_edit.Uri=http://www.google.com/calendar/feeds/0e16jkbndsprej0ip1m8dc9ihg%40group.calendar.google.com/private/full/mfl8vabke7hcp2kj1hupbf13ao(要更新的活動)

EventEntry指定該活動
EventEntry toUpdate = (EventEntry)feed_Edit.Entries.FindById(ID_edit);

開始你要做的更換動作

toUpdate.Title.Text = this.title.Text;
toUpdate.Content.Content = this.Content.Text;
toUpdate.Times.Add(new When(DateTime.Now, DateTime.Now.AddHours(2)));

批次單一筆:這裡是只有一筆要更新
toUpdate.BatchData = new GDataBatchEntryData("A", GDataBatchOperationType.update);




 // 添加項到一個新的feed.
AtomFeed batchFeed = new AtomFeed(feed_Edit);
batchFeed.Entries.Add(toUpdate);
批次處理
EventFeed batchResultFeed = (EventFeed)service.Batch(batchFeed,newUri(feed_Edit.Batch));




批次多種不同事件:如果你有多筆新增、更新、刪除

//創建一個批次處理,更新現有的
EventEntry toUpdate = (EventEntry)feed_Edit.Entries.FindById(ID_edit);


oUpdate.Title.Text = this.title.Text;
toUpdate.Content.Content = this.Content.Text;
toUpdate.Times.Add(new When(DateTime.Now, DateTime.Now.AddHours(2)));


toUpdate.BatchData = new GDataBatchEntryData("A", GDataBatchOperationType.update);


// 創建一個批次處理,刪除現有的
EventEntry toDelete = (EventEntry)feed.FindById(ID_Del);
toDelete.BatchData = new GDataBatchEntryData("B", GDataBatchOperationType.delete);


// 創建一個批次處理中插入一個新的事件
//EventEntry toCreate = new EventEntry("new event");
//toCreate.Title.Text = "Tutor";
//toCreate.Content.Content = "Tutor內容";
//toCreate.Times.Add(new When(DateTime.Now, DateTime.Now.AddHours(2)));
//toCreate.BatchData = new GDataBatchEntryData("C", GDataBatchOperationType.insert);


// 添加項到一個新的feed.
//AtomFeed batchFeed = new AtomFeed(feed_Edit);
//batchFeed.Entries.Add(toUpdate);
//batchFeed.Entries.Add(toDelete);
//batchFeed.Entries.Add(toCreate);


//EventFeed batchResultFeed = (EventFeed)service.Batch(batchFeed, new Uri(feed.Batch));



最後的判別資料是否有正常寫入:

 //檢查返回值的批處理操作,以確保它們都工作。
                //插入操作應該返回一個 201,其餘的應該返回200
                bool success = true;
                foreach (EventEntry entry in batchResultFeed.Entries)
                {
                    if (entry.BatchData.Status.Code != 200 && entry.BatchData.Status.Code != 201)
                    {
                        success = false;
                        label_b.Text = "批處理操作ID為" + entry.BatchData.Id + " failed.";
                    }
                }
                if (success)
                {
                    label_b.Text = "所有的批處理操作成功!";
                }



批次處理完成:


更新前及更新後:




Google Calendar 可以批次處理是真的比較方便,而且對效能方面也比較好修改及刪除雖然有點複雜,但其實實作起來還好,在尋找標題轉換成ID方面比較麻煩而已,並不難,看完的人應該就能開始控制Calendar了,如果還是不太會的可以留言或寫信給我,我再做更進一步的說明。

2 則留言:

  1. 你好,

    請問EventEntry指定該活動
    EventEntry toUpdate = (EventEntry)feed_Edit.Entries.FindById(ID_edit);
    執行後此物件為null,不知道是為什麼?

    回覆刪除
  2. 我想知道要去哪邊查詢關於這個API的使用方法
    如果撈資料,撈出來怎麼使用 之類的。

    回覆刪除

您的寶貴建議是我前進的動力!