Saya ingin menyinkronkan data (seperti catatan db, media) antara Aplikasi Android dan Server. Jika Anda pernah melihat Evernote
atau Aplikasi serupa, Anda tentu mengerti apa yang saya maksud.
Saya punya beberapa pertanyaan (bayangkan kami ingin menyinkronkan catatan DB):
Setiap pengguna memiliki bagian ruang server untuk dirinya sendiri (seperti
Evernote
atauDropbox
). Mungkin pengguna membuat catatan baru dengan ponsel dan membuat catatan baru di server. Bagaimana saya bisa mencocokkan catatan ini bersama? Jika ada catatan dengan ID yang sama Algoritma apa yang Anda sarankan untuk saya?Kecuali JSON , Apakah ada cara untuk mengirim data antara perangkat ponsel dan server?
Jika SyncAdapter dan ContentProvider dapat menyelesaikan masalah saya, mohon jelaskan untuk saya. (Jika Anda dapat menawarkan beberapa contoh atau tutorial kepada saya ATAU Saran atau kata kunci untuk membantu memperluas / membimbing pencarian saya akan dihargai juga).
sumber
Jawaban:
Saya akan mencoba menjawab semua pertanyaan Anda dengan menjawab pertanyaan yang lebih besar: Bagaimana saya bisa menyinkronkan data antara server web dan aplikasi Android?
Menyinkronkan data antara server web Anda dan aplikasi android memerlukan beberapa komponen berbeda pada perangkat android Anda.
Penyimpanan Persisten:
Ini adalah bagaimana ponsel Anda sebenarnya menyimpan data yang diterimanya dari server web. Salah satu metode yang mungkin untuk mencapai ini adalah menulis ContentProvider kustom Anda sendiri yang didukung oleh database Sqlite. Tutorial yang layak untuk penyedia konten dapat ditemukan di sini: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-own-contentprovider/
Sebuah ContentProvider mendefinisikan antarmuka yang konsisten untuk berinteraksi dengan data yang tersimpan. Itu juga bisa memungkinkan aplikasi lain untuk berinteraksi dengan data Anda jika Anda mau. Di belakang ContentProvider Anda bisa berupa database Sqlite, Cache, atau mekanisme penyimpanan sewenang-wenang.
Meskipun saya pasti akan merekomendasikan menggunakan ContentProvider dengan database Sqlite Anda bisa menggunakan mekanisme penyimpanan berbasis java yang Anda inginkan.
Format Pertukaran Data:
Ini adalah format yang Anda gunakan untuk mengirim data antara server web Anda dan aplikasi Android Anda. Dua format paling populer saat ini adalah XML dan JSON. Saat memilih format Anda, Anda harus memikirkan perpustakaan serialisasi seperti apa yang tersedia. Saya tahu secara langsung bahwa ada perpustakaan fantastis untuk serialisasi json yang disebut gson: https://github.com/google/gson , meskipun saya yakin ada perpustakaan serupa untuk XML.
Layanan Sinkronisasi
Anda akan menginginkan semacam tugas tidak sinkron yang bisa mendapatkan data baru dari server Anda dan menyegarkan konten seluler untuk mencerminkan konten server. Anda juga ingin memberi tahu server setiap kali Anda membuat perubahan lokal pada konten dan ingin mencerminkan perubahan itu. Android menyediakan pola SyncAdapter sebagai cara untuk dengan mudah menyelesaikan pola ini. Anda harus mendaftarkan akun pengguna, dan kemudian Android akan melakukan banyak keajaiban untuk Anda, dan memungkinkan Anda untuk secara otomatis menyinkronkan. Berikut tutorial yang bagus: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
Adapun cara Anda mengidentifikasi apakah catatan itu sama, biasanya Anda akan membuat item dengan id unik yang Anda simpan di perangkat android dan server. Anda dapat menggunakannya untuk memastikan Anda merujuk ke referensi yang sama. Selain itu, Anda dapat menyimpan atribut kolom seperti "updated_at" untuk memastikan bahwa Anda selalu mendapatkan data terbaru, atau Anda tidak sengaja menulis data yang baru ditulis.
sumber
Jika kita memikirkan hari ini , jawaban yang diterima terlalu tua. Seperti yang kita ketahui bahwa kita memiliki banyak perpustakaan baru yang dapat membantu Anda membuat aplikasi jenis ini.
Anda harus mempelajari topik-topik berikut yang pasti akan membantu Anda:
SyncAdapter: Komponen adaptor sinkronisasi di aplikasi Anda mengenkapsulasi kode untuk tugas-tugas yang mentransfer data antara perangkat dan server. Berdasarkan penjadwalan dan pemicu yang Anda berikan di aplikasi Anda, kerangka kerja adaptor sinkronisasi menjalankan kode dalam komponen adaptor sinkronisasi.
Realm : Realm adalah basis data seluler: pengganti SQLite & Core Data.
Klien HTTP yang aman dengan Retrofit untuk Android dan Java oleh Square, Inc. Harus Mempelajari retrofit cara-pintar-menggunakan
Dan logika sinkronisasi Anda untuk basis data seperti: Bagaimana cara menyinkronkan database SQLite di ponsel Android dengan database MySQL di server?
Keberuntungan terbaik untuk semua pelajar baru. :)
sumber
Jika Anda menulis ini sendiri, ini adalah beberapa hal yang perlu diingat
Otentikasi yang tepat antara perangkat dan Server Sync
Protokol sinkronisasi antara perangkat dan server. Biasanya akan masuk dalam 3 fase, otentikasi, pertukaran data, pertukaran status (operasi mana yang berhasil dan yang gagal)
Pilih format payload Anda. Saya menyarankan XML berbasis SyncML dicampur dengan format berbasis JSON untuk mewakili data aktual. Jadi SyncML untuk protokol, dan JSON untuk data aktual yang dipertukarkan. Menggunakan JSON Array saat memanipulasi data selalu lebih disukai karena mudah untuk mengakses data menggunakan JSON Array.
Melacak perubahan data pada klien dan server. Anda dapat mempertahankan daftar perubahan id yang berubah dan mengambilnya selama sesi sinkronisasi. Juga, hapus changelog saat objek berhasil disinkronkan. Anda juga dapat menggunakan variabel boolean untuk mengonfirmasi status sinkronisasi, yaitu terakhir kali sinkronisasi. Akan bermanfaat bagi pengguna akhir untuk mengidentifikasi waktu saat sinkronisasi terakhir dilakukan.
Perlu memiliki cara untuk berkomunikasi dari server ke perangkat untuk memulai sesi sinkronisasi ketika data berubah di server. Anda dapat menggunakan C2DM atau menulis komunikasi berbasis tcp persisten Anda sendiri. Pendekatan tcp jauh lebih mulus
Cara untuk mereplikasi perubahan data di beberapa perangkat
Dan yang terakhir, cara untuk mendeteksi dan menangani konflik
Semoga ini bisa membantu sebagai titik awal yang baik.
sumber
@Grantismo memberikan penjelasan yang bagus tentang keseluruhan. Jika Anda ingin tahu orang-orang yang benar-benar melakukan hal ini, saya sarankan Anda untuk melihat bagaimana google melakukannya untuk Google IO App of 2014 (selalu perlu melihat lebih dalam pada kode sumber aplikasi ini yang mereka rilis. Ada banyak belajar dari sana).
Berikut posting blog tentang hal itu: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
Pada dasarnya, di sisi aplikasi: GCM untuk pensinyalan, Adaptor Sinkronisasi untuk pengambilan data dan berbicara dengan benar dengan Penyedia Konten yang akan membuat hal-hal tetap ada (yeah, ini mengisolasi DB dari akses langsung dari bagian lain aplikasi).
Juga, jika Anda ingin melihat kode 2015: https://github.com/google/iosched
sumber
Misalnya, Anda ingin menyinkronkan tabel
todoTable
dariMySql
keSqlite
Pertama, membuat satu nama kolom
version (type INT)
ditodoTable
untuk keduaSqlite
danMySql
Kedua, buat nama tabel
database_version
dengan satu nama kolomcurrentVersion(INT)
Di
MySql
, ketika Anda menambahkan item baru ketodoTable
atau memperbarui item, Anda harus meningkatkan versi item ini dengan +1 dan juga memperbaruicurrentVersion
Di
Android
, ketika Anda ingin menyinkronkan (dengan tekan secara manual tombol sinkronisasi atau layanan berjalan dengan periode waktu):Anda akan mengirim permintaan dengan versi
Sqlite
Current (sekarang ini 1) ke server.Kemudian di server, Anda menemukan item apa yang
MySql
memiliki nilai versi lebih besar dariSqlite
currentVersion (1) kemudian merespons ke Android (dalam contoh ini item 3 dengan versi 2 akan merespons ke Android)Di
SQLite
, Anda akan menambah atau memperbarui item baru ketodoTable
dan memutakhirkan Versi saat inisumber
Lihatlah parseplatform.org . itu proyek opensource.
(Serta Anda dapat pergi untuk paket komersial yang tersedia di back4app.com .)
Ini adalah layanan basis data sisi server yang sangat mudah dan ramah pengguna yang memberikan API sisi klien Android yang hebat
sumber
salah satu cara untuk mencapai ini untuk memiliki aplikasi sisi server yang menunggu data. Data dapat dikirim menggunakan
HttpRequest
objek di Jawa atau Anda dapat menulisTCP/IP
utilitas transfer data Anda sendiri . Data dapat dikirim menggunakanJSON
format atau format lain yang menurut Anda cocok. Juga data dapat dienkripsi sebelum dikirim ke server jika mengandung informasi sensitif. Yang harus dilakukan aplikasi Server hanyalah menunggu untukHttpRequests
masuk dan mem-parsing data dan menyimpannya di mana pun Anda inginkan.sumber
Saya akan menyarankan menggunakan protokol layanan web biner mirip dengan Hessian . Ini bekerja dengan sangat baik dan mereka memiliki implementasi android. Mungkin agak berat tetapi tergantung pada aplikasi yang Anda bangun. Semoga ini membantu.
sumber
@Grantismo memberikan gambaran besar tentang komponen sinkronisasi Android.
Perpustakaan SyncManagerAndroid menyediakan implementasi sinkronisasi 2 arah yang sederhana untuk menghubungkan ke kerangka kerja Android Sync (AbstractThreadedSyncAdapter.OnPerformSync).
https://github.com/sschendel/SyncManagerAndroid
sumber