คำแนะนำนี้จะอธิบายวิธีใช้การซิงค์ข้อมูลปฏิทินแบบเพิ่มทีละรายการ ซึ่งวิธีนี้จะช่วยให้คุณซิงค์ข้อมูลของคอลเล็กชันปฏิทินทั้งหมดได้พร้อมกับประหยัดแบนด์วิดท์
เนื้อหา
ภาพรวม
การซิงค์แบบเพิ่มทีละรายการมี 2 ขั้นตอนดังนี้
การซิงค์แบบเต็มครั้งแรก: ดำเนินการ 1 ครั้งที่จุดเริ่มต้นเพื่อซิงค์ สถานะไคลเอ็นต์กับสถานะเซิร์ฟเวอร์อย่างเต็มรูปแบบ ไคลเอ็นต์จะได้รับโทเค็นการซิงค์ที่ต้องเก็บไว้
การซิงค์แบบเพิ่มทีละรายการ: ดำเนินการซ้ำๆ เพื่ออัปเดตไคลเอ็นต์ด้วย การเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นนับตั้งแต่การซิงค์ครั้งก่อน โดยแต่ละครั้งไคลเอ็นต์จะระบุโทเค็นการซิงค์ก่อนหน้าที่ได้รับจากเซิร์ฟเวอร์และจัดเก็บโทเค็นการซิงค์ใหม่จากการตอบกลับ
การซิงค์แบบเต็มครั้งแรก
การซิงค์แบบเต็มครั้งแรกคือคำขอเดิมสำหรับทรัพยากรทั้งหมดของคอลเล็กชันที่ต้องการซิงค์ คุณเลือกจำกัดคำขอรายการโดยใช้พารามิเตอร์คำขอได้หากต้องการซิงค์เฉพาะทรัพยากรบางส่วน
ในการตอบกลับการดำเนินการรายการ การตอบกลับจะมีช่องชื่อ nextSyncToken ซึ่งแสดงโทเค็นการซิงค์ คุณต้องจัดเก็บค่าของ nextSyncToken หากชุดผลลัพธ์มีขนาดใหญ่เกินไปและการตอบกลับมีการ
แบ่งหน้า ช่อง nextSyncToken
จะปรากฏในหน้าสุดท้ายเท่านั้น
การซิงค์แบบเพิ่มทีละรายการ
การซิงค์แบบเพิ่มทีละรายการช่วยให้คุณดึงข้อมูลทรัพยากรทั้งหมดที่ได้รับการแก้ไขนับตั้งแต่คำขอซิงค์ครั้งล่าสุด โดยทำได้ด้วยการส่งคำขอรายการพร้อมระบุโทเค็นการซิงค์ล่าสุดในช่อง syncToken
โปรดทราบว่าผลลัพธ์จะมีรายการที่ถูกลบเสมอ เพื่อให้ไคลเอ็นต์นำรายการเหล่านั้นออกจากพื้นที่เก็บข้อมูลได้
ในกรณีที่ทรัพยากรจำนวนมากมีการเปลี่ยนแปลงนับตั้งแต่คำขอซิงค์แบบเพิ่มทีละรายการครั้งล่าสุด คุณอาจเห็น pageToken แทน syncToken ในผลลัพธ์รายการ ในกรณีนี้ ให้ส่งคำขอรายการเดียวกันกับที่ใช้ดึงข้อมูลหน้าแรกในการซิงค์แบบเพิ่มทีละรายการ (โดยใช้ syncToken เดียวกัน) แนบ pageToken ไปกับคำขอ และแบ่งหน้าผ่านคำขอที่ตามมาจนกว่าจะพบ syncToken อีกรายการในหน้าสุดท้าย จัดเก็บ syncToken นี้ไว้สำหรับคำขอซิงค์ครั้งถัดไป
ตัวอย่างต่อไปนี้แสดงการซิงค์แบบเพิ่มทีละรายการที่มีการแบ่งหน้า
การค้นหาเดิม
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
ผลลัพธ์มีข้อมูลต่อไปนี้
{
"nextPageToken": "CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA"
}
การดึงข้อมูลหน้าถัดไป
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
เซิร์ฟเวอร์กำหนดให้ซิงค์แบบเต็ม
บางครั้งเซิร์ฟเวอร์จะทำให้โทเค็นการซิงค์ไม่ถูกต้องเนื่องจากโทเค็นหมดอายุหรือมีการเปลี่ยนแปลง ACL ที่เกี่ยวข้อง ในกรณีดังกล่าว เซิร์ฟเวอร์จะตอบกลับคำขอแบบเพิ่มทีละรายการด้วยรหัสสถานะ HTTP 410 เมื่อเกิดกรณีนี้ ให้ล้างพื้นที่เก็บข้อมูลของไคลเอ็นต์และทำการซิงค์แบบเต็มครั้งใหม่
โค้ดตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีใช้โทเค็นการซิงค์กับไลบรารีของไคลเอ็นต์
Java เมื่อมีการเรียกใช้เมธอด run() เป็นครั้งแรก เมธอดจะทำการซิงค์แบบเต็มและจัดเก็บโทเค็นการซิงค์
ในการดำเนินการครั้งต่อๆ ไป เมธอดจะโหลดโทเค็นการซิงค์ที่บันทึกไว้และทำการซิงค์แบบเพิ่มทีละรายการ
private static void run() throws IOException { // Construct the {@link Calendar.Events.List} request, but don't execute it yet. Calendar.Events.List request = client.events().list("primary"); // Load the sync token stored from the last execution, if any. String syncToken = syncSettingsDataStore.get(SYNC_TOKEN_KEY); if (syncToken == null) { System.out.println("Performing full sync."); // Set the filters you want to use during the full sync. Sync tokens aren't compatible with // most filters, but you may want to limit your full sync to only a certain date range. // In this example we are only syncing events up to a year old. Date oneYearAgo = Utils.getRelativeDate(java.util.Calendar.YEAR, -1); request.setTimeMin(new DateTime(oneYearAgo, TimeZone.getTimeZone("UTC"))); } else { System.out.println("Performing incremental sync."); request.setSyncToken(syncToken); } // Retrieve the events, one page at a time. String pageToken = null; Events events = null; do { request.setPageToken(pageToken); try { events = request.execute(); } catch (GoogleJsonResponseException e) { if (e.getStatusCode() == 410) { // A 410 status code, "Gone", indicates that the sync token is invalid. System.out.println("Invalid sync token, clearing event store and re-syncing."); syncSettingsDataStore.delete(SYNC_TOKEN_KEY); eventDataStore.clear(); run(); } else { throw e; } } List<Event> items = events.getItems(); if (items.size() == 0) { System.out.println("No new events to sync."); } else { for (Event event : items) { syncEvent(event); } } pageToken = events.getNextPageToken(); } while (pageToken != null); // Store the sync token from the last request to be used during the next execution. syncSettingsDataStore.set(SYNC_TOKEN_KEY, events.getNextSyncToken()); System.out.println("Sync complete."); }
การซิงค์แบบเดิม
สำหรับคอลเล็กชันกิจกรรม คุณสามารถทำการซิงค์แบบเดิมได้โดยการบันทึกค่าของ
ช่อง updated จากคำขอรายการกิจกรรม แล้วใช้
updatedMin เพื่อดึงข้อมูลกิจกรรมที่อัปเดต เราไม่แนะนำให้ใช้วิธีนี้อีกต่อไปเนื่องจากมีแนวโน้มที่จะเกิดข้อผิดพลาดได้ง่ายกว่า (เช่น ไม่บังคับใช้ข้อจำกัดการค้นหา) และใช้ได้กับกิจกรรมเท่านั้น