Pertanyaan Core Data Sync - Pelacakan Objek yang Dihapus


Saya sedang menyiapkan layanan sinkronisasi dasar untuk aplikasi iPad yang sedang saya kembangkan. Tujuannya adalah untuk memiliki data yang konsisten melalui beberapa contoh aplikasi iPad, serta memiliki versi hanya-baca dari data di web, sehingga menggulirkan solusi khusus.

Aliran saat ini adalah ini:

  • Setiap entitas memiliki bidang 'dibuat', 'dimodifikasi' dan 'UUID' yang secara otomatis diperbarui oleh Data Inti
  • Pada sinkronisasi, setiap entitas dengan tanggal yang dibuat atau diubah setelah tanggal sinkronisasi terakhir diserialisasi ke dalam JSON dan dikirim ke server
  • Server tetap ada perubahan ke database MySQL menggunakan UUID yang dibuat oleh klien sebagai PK (jika ada konflik, itu hanya menggunakan entitas yang paling baru dimodifikasi sebagai versi 'benar', tidak ada yang mewah di sana) dan mengirimkan kembali entitas yang diperbarui ke klien
  • Klien kemudian menggabungkan kembali perubahan ini ke dalam Data Core DB-nya

Semua ini tampaknya berjalan dengan baik. Masalah saya adalah cara melacak objek yang dihapus menggunakan metode ini? Saya kira saya dapat menambahkan 'dihapus' bendera untuk setiap entitas dan mengatur ini setiap kali klien menghapus sesuatu, saya kemudian dapat mendorong perubahan itu ke server dengan sisa data sinkronisasi. Setelah sinkronisasi selesai, klien dapat benar-benar menghapus entitas ini. Pertanyaan saya adalah:

  • Dapatkah saya mengganti metode penghapusan Core Data untuk secara otomatis mengatur bendera ini?
  • Apakah ini perlu menjaga semua entitas dihapus tanpa batas di server? Kami tidak akan mengetahui kapan setiap klien telah disinkronkan dan benar-benar menghapus setiap entitas (saya saat ini tidak melacak klien)
  • Apakah ada cara yang lebih baik untuk melakukan ini?

6
2018-01-26 09:45


asal


Jawaban:


Bagaimana jika Anda menyimpan tabel riwayat delta dengan UUID dan bidang yang dibuat / diperbarui / dihapus, mungkin dengan nomor revisi untuk setiap pembaruan? Jadi Anda menyimpan daftar periksa perubahan kecil sejak sinkronisasi terakhir Anda yang berhasil.

Dengan begitu, jika Anda menghapus objek, Anda dapat menambahkan entri di tabel riwayat delta dengan UUID yang dihapus dan menandainya dihapus. Sama dengan objek yang dibuat dan diperbarui, Anda hanya perlu memeriksa tabel delta untuk melihat item apa yang perlu dihapus oleh server Anda, perbarui, buat, dll. Anda bahkan dapat menyimpan setiap revisi pada server untuk mendukung mengembalikan ke versi sebelumnya di masa depan jika Anda merasa menyukainya.

Saya pikir nomor revisi lebih baik daripada mengandalkan jam klien yang berpotensi diubah secara manual.

Anda bisa menggunakan metode yang dimasukkan NSManagedObjectContext, obyek yang diperbarui, objek yang dihapus untuk membuat objek delta sebelum setiap prosedur penyimpanan :)

2 sen saya


5
2018-02-01 12:00



Mengenai pertanyaan kedua Anda: Anda dapat mendesain ini agar server tidak perlu menyimpan catatan yang dihapus, jika Anda mau. Biarkan setiap aplikasi mengetahui apakah bagian data tertentu (berdasarkan UUID) disimpan di server (mis. Menambahkan properti onServer yang ada atau serupa). Ini mulai salah ketika item baru dibuat di aplikasi, tetapi disetel ke true setelah disinkronkan ke server untuk pertama kalinya. Dengan begitu, jika aplikasi mencoba menyinkronkan nanti, tetapi UUID tidak ditemukan, Anda dapat membedakan kedua kasus: Jika adaOnServer salah, maka item ini baru dibuat dan harus disinkronkan ke server, tetapi jika itu benar maka bisa diartikan bahwa itu sudah ada di pemutusan sebelumnya, tetapi sekarang telah dihapus, sehingga Anda dapat menghapusnya di aplikasi juga.

Saya mungkin akan berdebat melawan pendekatan ini, karena tampaknya lebih rentan terhadap kesalahan saya (saya membayangkan kesalahan database atau koneksi salah ditafsirkan sebagai penghapusan) dan menyimpan catatan di server Anda biasanya bukan masalah besar, tetapi mungkin. "Delta-approach" yang disarankan oleh dzeikei dapat digunakan pada saat yang sama, jadi pembaruan untuk catatan yang tidak ada di server menandakan bahwa itu dihapus, sementara insert tidak.


1
2018-02-02 09:58



Apakah Anda harus menyimpan objek yang dihapus di server atau tidak sepenuhnya bergantung pada kebutuhan Anda. Anda akan membutuhkan bendera dihapus secara lokal untuk menandai sebagai dihapus untuk sinkronisasi, mungkin juga pada server tergantung pada keinginan Anda untuk memutar kembali.

Saya telah mengurus masalah ini dengan beberapa cara sebelumnya. Ini ada satu kemungkinan:

Ketika klien menghapus sesuatu, cukup tandai untuk dihapus secara lokal dan hapus dari server selama sinkronisasi (pada titik mana Anda dapat membersihkan dari data inti). Ketika klien lain meminta untuk mengakses data itu, kirim kembali HTTP 404 karena Anda tidak memiliki objek lagi. Pada titik itu klien dapat menghapus entitas secara lokal. Sekarang jika klien meminta daftar hal-hal dan objek ini telah dihapus, itu hanya akan hilang dari daftar hal-hal yang dia dapatkan kembali sehingga Anda dapat mendeteksi itu dan menghapusnya. Saya melakukan itu di klien dengan membuat array ID objek ketika saya mendapat respon dari server dan menghapus objek lokal yang tidak memiliki ID tersebut.

Kami memiliki bidang yang dihapus di server, tetapi hanya memiliki kemampuan untuk memutar kembali jika ada sesuatu yang dihapus secara tidak sengaja.

Tentu saja Anda bisa mengembalikan objek yang dihapus ke klien sehingga mereka tahu untuk menghapus tetapi jika Anda tidak ingin menyimpan salinan di server, Anda harus membuat beberapa asumsi bahwa klien akan semua pembaruan dalam kerangka waktu. Kemudian Anda bisa mengumpulkan sampah setelah jangka waktu tersebut berakhir.

Saya tidak begitu suka solusi itu. Jika data Anda terlalu berat untuk meminta semua objek untuk sinkronisasi lengkap, Anda bisa menggunakan strategi penggabungan Anda saat ini untuk membuat dan memperbarui, dan kemudian jalankan panggilan terpisah untuk memeriksa item yang dihapus. Panggilan itu hanya dapat meminta semua ID yang seharusnya dimiliki klien di perangkat. Itu bisa menghapus yang tidak ada. ATAU itu bisa mengirim semua ID pada klien dan mendapatkan kembali daftar ID untuk dihapus.

Saya pikir Anda harus memberikan rincian lebih lanjut tentang sifat data jika Anda menginginkan saran yang lebih beropini.


1
2018-02-07 03:36



Anda dapat melihatnya Sinkronisasi Data Lintas-Platform oleh Dan Grover jika kamu belum. Ini adalah makalah yang ditulis dengan sangat baik mengenai sinkronisasi dan iOS.

Tentang pertanyaan Anda:

  1. Anda dapat menghindari penghapusan file di Core Data dan mengatur 'hapus bendera': cukup perbarui file, bukan menghapusnya. Anda bisa membuat metode 'menghapus' Anda sendiri yang benar-benar akan memanggil dan memperbarui bendera pada rekaman.

  2. Simpan selalu last_sync dan last_updated untuk setiap catatan di server dan di setiap klien. Dengan cara ini Anda akan selalu tahu ketika seseorang melakukan perubahan di mana saja dan jika perubahan itu disinkronkan atau tidak melawan 'basis data kebenaran'.

  3. Melacak file yang dihapus adalah hal yang sulit dilakukan, saya kira cara terbaik untuk melakukannya adalah melacak riwayat sinkronisasi untuk setiap tabel, tetapi merupakan tugas yang sulit. Cara termudah, menggunakan konfigurasi jenis 'database-kebenaran' ini adalah dengan menandakan file, sehingga ya, Anda harus menyimpan data di server dan juga pada klien.


1
2018-01-08 19:39



selama sinkronisasi data antara meja derek beberapa catatan atau dihapus ketika baris tabel adalah sama. dan ketika baris berbeda disinkronkan dengan benar, saya menggunakan Kode ini klik di sini pada gambar

enter image description here


-3
2018-02-23 06:18