Panduan ini menjelaskan cara mengimplementasikan "sinkronisasi inkremental" data kalender. Dengan menggunakan , Anda dapat menyimpan data untuk semua koleksi kalender secara sinkron selagi menyimpan {i>bandwidth<i}.
Daftar Isi
Ringkasan
Sinkronisasi inkremental terdiri dari dua tahap:
Sinkronisasi penuh awal dilakukan sekali di awal untuk sepenuhnya menyinkronkan status klien dengan status server. Klien akan mendapatkan token sinkronisasi yang harus dipertahankan.
Sinkronisasi inkremental dijalankan berulang kali dan memperbarui klien dengan semua perubahan yang terjadi sejak sinkronisasi sebelumnya. Setiap kali, klien memberikan token sinkronisasi sebelumnya yang diperoleh dari server dan menyimpan token sinkronisasi baru dari respons.
Sinkronisasi penuh awal
Sinkronisasi penuh awal adalah permintaan asli untuk semua resource koleksi yang ingin disinkronkan. Anda juga dapat membatasi daftar permintaan menggunakan parameter permintaan jika Anda hanya ingin menyinkronkan subset resource.
Sebagai respons terhadap operasi daftar, Anda akan menemukan kolom yang disebut
nextSyncToken
yang mewakili token sinkronisasi. Anda harus menyimpan nilai
nextSyncToken
. Jika kumpulan hasil terlalu besar dan respons menjadi
dipaginasi, lalu nextSyncToken
hanya ada di halaman terakhir.
Sinkronisasi inkremental
Sinkronisasi inkremental memungkinkan Anda
untuk mengambil semua sumber daya yang
dimodifikasi sejak permintaan sinkronisasi terakhir. Untuk melakukannya, Anda perlu membuat daftar
permintaan dengan token sinkronisasi terbaru yang ditentukan di kolom syncToken
.
Ingatlah bahwa hasilnya akan selalu berisi entri yang dihapus, sehingga
klien mendapatkan kesempatan untuk
menghapusnya dari penyimpanan.
Dalam kasus di mana sejumlah besar resource telah berubah sejak
permintaan sinkronisasi inkremental, Anda mungkin akan menemukan pageToken
, bukan syncToken
, dalam hasil daftar. Dalam kasus ini, Anda harus
melakukan langkah yang sama
daftar kueri sebagaimana digunakan untuk mengambil laman pertama dalam sinkronisasi inkremental
(dengan syncToken
yang sama persis), tambahkan pageToken
ke dalamnya dan
beri nomor halaman ke semua permintaan berikut hingga Anda menemukan syncToken
lainnya di halaman terakhir. Pastikan untuk menyimpan syncToken
ini untuk sinkronisasi berikutnya
permintaan Anda di masa mendatang.
Berikut adalah contoh kueri untuk kasus yang memerlukan sinkronisasi bernomor halaman secara inkremental:
Kueri asli
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx
// Result contains the following
"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",
Mengambil halaman berikutnya
GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA
Sinkronisasi penuh diperlukan oleh server
Terkadang token sinkronisasi tidak valid oleh server, karena berbagai alasan
termasuk akhir masa berlaku token
atau perubahan ACL terkait.
Dalam kasus seperti itu, server akan merespons permintaan inkremental dengan
kode respons 410
. Tindakan ini akan memicu penghapusan total toko klien
dan sinkronisasi penuh baru.
Kode contoh
Cuplikan kode contoh di bawah menunjukkan cara menggunakan token sinkronisasi dengan Library klien Java. Pertama kali dipanggil, metode ini akan melakukan sinkronisasi penuh dan menyimpan token sinkronisasi. Pada setiap eksekusi berikutnya, token tersebut akan memuat token sinkronisasi yang disimpan dan melakukan sinkronisasi inkremental.
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."); }
Sinkronisasi lama
Untuk koleksi acara, Anda masih dapat melakukan sinkronisasi di
cara lama dengan mempertahankan nilai kolom yang diperbarui dari daftar peristiwa
lalu menggunakan kolom modifiedSince
untuk mengambil peristiwa yang diupdate.
Pendekatan ini tidak lagi direkomendasikan karena lebih rentan terhadap error
ke pembaruan yang terlewatkan (misalnya jika tidak menerapkan batasan kueri).
Selain itu, fitur ini hanya tersedia untuk acara.