คู่มือนี้อธิบายวิธีใช้ "การซิงค์แบบเพิ่ม" ของข้อมูลปฏิทิน การใช้วิธีนี้จะช่วยให้คุณซิงค์ข้อมูลสำหรับคอลเล็กชันปฏิทินทั้งหมดได้ในขณะที่ประหยัดแบนด์วิดท์
เนื้อหา
ภาพรวม
การซิงค์ส่วนเพิ่มประกอบด้วย 2 ขั้นตอน ดังนี้
การซิงค์เต็มรูปแบบครั้งแรกจะดำเนินการเพียงครั้งเดียวในช่วงเริ่มต้น เพื่อให้ สถานะของไคลเอ็นต์ซิงค์กับสถานะของเซิร์ฟเวอร์ได้อย่างสมบูรณ์ ไคลเอ็นต์จะได้รับ โทเค็นการซิงค์ที่ต้องเก็บไว้
การซิงค์แบบเพิ่มจะดำเนินการซ้ำๆ และอัปเดตไคลเอ็นต์ด้วยการเปลี่ยนแปลงทั้งหมด ที่เกิดขึ้นนับตั้งแต่การซิงค์ครั้งก่อน ทุกครั้งที่ดำเนินการ ไคลเอ็นต์จะระบุโทเค็นการซิงค์ก่อนหน้าที่ได้รับจากเซิร์ฟเวอร์และจัดเก็บโทเค็นการซิงค์ใหม่จากคำตอบ
การซิงค์แบบเต็มครั้งแรก
การซิงค์ทั้งหมดครั้งแรกคือคำขอเดิมสำหรับทรัพยากรทั้งหมดของ คอลเล็กชันที่คุณต้องการซิงโครไนซ์ คุณเลือกจำกัดคำขอรายการได้โดยใช้พารามิเตอร์คำขอ หากต้องการซิงค์เฉพาะชุดย่อยของทรัพยากรที่เฉพาะเจาะจง
ในการตอบกลับการดำเนินการของรายการ คุณจะเห็นฟิลด์ที่ชื่อ
nextSyncToken
ซึ่งแสดงโทเค็นการซิงค์ คุณจะต้องจัดเก็บค่าของ
nextSyncToken
หากชุดผลลัพธ์มีขนาดใหญ่เกินไปและคำตอบแบ่งหน้า ฟิลด์ nextSyncToken
จะปรากฏในหน้าสุดท้ายเท่านั้น
การซิงค์ส่วนเพิ่ม
การซิงค์แบบเพิ่มช่วยให้คุณดึงข้อมูลทรัพยากรทั้งหมดที่มีการ
แก้ไขนับตั้งแต่คำขอซิงค์ครั้งล่าสุด โดยคุณต้องส่งคำขอ list
พร้อมระบุโทเค็นการซิงค์ล่าสุดในฟิลด์ syncToken
โปรดทราบว่าผลลัพธ์จะมีรายการที่ถูกลบเสมอ เพื่อให้ไคลเอ็นต์มีโอกาสนำรายการเหล่านั้นออกจากที่เก็บข้อมูล
ในกรณีที่มีการเปลี่ยนแปลงทรัพยากรจํานวนมากตั้งแต่คําขอซิงค์แบบเพิ่มครั้งล่าสุด คุณอาจเห็น pageToken
แทน syncToken
ในผลลัพธ์ของรายการ ในกรณีเหล่านี้ คุณจะต้องทำการค้นหาแบบรายการที่เหมือนกันทุกประการ
กับที่ใช้ในการดึงข้อมูลหน้าแรกในการซิงค์แบบเพิ่ม
(โดยใช้ syncToken
เดียวกันทุกประการ) จากนั้นให้ต่อท้าย pageToken
และ
แบ่งหน้าผ่านคำขอทั้งหมดต่อไปนี้จนกว่าจะพบ syncToken
อีกรายการในหน้าสุดท้าย โปรดเก็บ syncToken
นี้ไว้สำหรับคำขอซิงค์ครั้งถัดไปในอนาคต
ตัวอย่างคำค้นหาสำหรับกรณีที่ต้องมีการซิงค์แบบแบ่งหน้าส่วนเพิ่มมีดังนี้
คำค้นหาเดิม
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
ดึงข้อมูลหน้าถัดไป
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
เซิร์ฟเวอร์กำหนดให้ซิงค์ทั้งหมด
บางครั้งเซิร์ฟเวอร์จะทำให้โทเค็นการซิงค์ไม่ถูกต้องด้วยเหตุผลต่างๆ
รวมถึงโทเค็นหมดอายุหรือการเปลี่ยนแปลงใน ACL ที่เกี่ยวข้อง
ในกรณีดังกล่าว เซิร์ฟเวอร์จะตอบสนองต่อคำขอที่เพิ่มขึ้นด้วยรหัสการตอบกลับ 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."); }
การซิงค์เวอร์ชันเดิม
สำหรับการรวบรวมเหตุการณ์ คุณยังคงซิงค์ข้อมูลในลักษณะเดิมได้โดยการเก็บค่าของฟิลด์ที่อัปเดตจากคำขอรายการเหตุการณ์ไว้ แล้วใช้ฟิลด์ modifiedSince
เพื่อดึงเหตุการณ์ที่อัปเดต
เราไม่แนะนำให้ใช้วิธีนี้อีกต่อไปเนื่องจากมีแนวโน้มที่จะเกิดข้อผิดพลาดมากกว่าในเรื่องการอัปเดตที่พลาดไป (เช่น หากไม่ได้บังคับใช้ข้อจำกัดของคําค้นหา)
นอกจากนี้ ยังใช้ได้กับกิจกรรมเท่านั้น