Sinkronkan data antara Aplikasi Android dan server web [ditutup]

262

Saya ingin menyinkronkan data (seperti catatan db, media) antara Aplikasi Android dan Server. Jika Anda pernah melihat Evernoteatau Aplikasi serupa, Anda tentu mengerti apa yang saya maksud.

Saya punya beberapa pertanyaan (bayangkan kami ingin menyinkronkan catatan DB):

  1. Setiap pengguna memiliki bagian ruang server untuk dirinya sendiri (seperti Evernoteatau Dropbox). 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?

  2. Kecuali JSON , Apakah ada cara untuk mengirim data antara perangkat ponsel dan server?

  3. 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).

Omid Nazifi
sumber
1
Pertama, Anda perlu mencari tahu (memutuskan) protokol komunikasi Anda dengan server - karenanya - data apa yang dapat Anda transfer dan bagaimana caranya.
hovanessyan
Itu penting bagi saya, mentransfer data SQLlite. tapi saya pasti tahu cara mentransfer data lain. Saya tidak mengerti maksud Anda tentang protokol. tolong jelaskan lebih lanjut.
Omid Nazifi
Dengan protokol yang saya maksud ini simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
coba konysync, produk konylab yang menyediakan solusi ujung ke ujung di berbagai platform (android, windows, ios), webservers, penyedia data (tenaga penjualan, penyedia getah), database (sqlserver, mysql ...)
saimadan

Jawaban:

311

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.

Grantismo
sumber
3
Bagaimana dengan sejumlah besar data? bagaimana saya bisa menyinkronkan?
Pratik Butani
4
Sangat jelas saya hanya punya catatan ... SyncAdapter -> "melakukan banyak sihir". Saya harap Anda menyebutnya sebagai ilmu hitam ... itu benar-benar jahat.
MRodrigues
@MRodrigues: SyncAdapter bisa menjadi ilmu hitam untuk pengembang tetapi masih melakukan sihir untuk stabilitas dan fungsionalitas, itu jauh lebih baik daripada
lib
2
Apa yang diperlukan oleh layanan web itu sendiri untuk menyinkronkannya dengan perangkat android? Apakah mungkin dengan Spring?
jublikon
58

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. :)

Pratik Butani
sumber
Tautan ke retrofit cara-pintar-digunakan sudah mati
Greg Holst
@GregHolst diperbarui.
Pratik Butani
3
Masih di bawah. Atau perlu masuk? Archive.org memilikinya: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul
24

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.

openmobster
sumber
14

@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

Ciro Costa
sumber
Kode sumber untuk aplikasi Google IO adalah IMO yang sangat berguna!
Richeek
10

Misalnya, Anda ingin menyinkronkan tabel todoTabledari MySqlkeSqlite

Pertama, membuat satu nama kolom version (type INT)di todoTableuntuk kedua SqlitedanMySql masukkan deskripsi gambar di sini

Kedua, buat nama tabel database_versiondengan satu nama kolomcurrentVersion(INT)
masukkan deskripsi gambar di sini

Di MySql, ketika Anda menambahkan item baru ke todoTableatau memperbarui item, Anda harus meningkatkan versi item ini dengan +1 dan juga memperbaruicurrentVersion masukkan deskripsi gambar di sini

Di Android, ketika Anda ingin menyinkronkan (dengan tekan secara manual tombol sinkronisasi atau layanan berjalan dengan periode waktu):

Anda akan mengirim permintaan dengan versi SqliteCurrent (sekarang ini 1) ke server.
Kemudian di server, Anda menemukan item apa yang MySqlmemiliki nilai versi lebih besar dari SqlitecurrentVersion (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 ke todoTabledan memutakhirkan Versi saat ini

Phan Van Linh
sumber
1
Ide Anda brilian tetapi masih tidak dapat memahami desain tabel dengan benar. Bersamaan dengan layanan lainnya dan layanan sinkronisasi yang tepat, program ini berfungsi
Ahesanali Suthar
6

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

Kyle
sumber
Apa saja paket gratis yang ditawarkan?
Prakhar Mohan Srivastava
12
http://parse.com/ dimatikan.
Chintan Rathod
4
Anda masih dapat menggunakan fungsionalitas parse.com, tetapi di server Anda sendiri, mereka memiliki sumber terbuka
geniushkg
3

salah satu cara untuk mencapai ini untuk memiliki aplikasi sisi server yang menunggu data. Data dapat dikirim menggunakan HttpRequestobjek di Jawa atau Anda dapat menulis TCP/IPutilitas transfer data Anda sendiri . Data dapat dikirim menggunakan JSONformat 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 untuk HttpRequestsmasuk dan mem-parsing data dan menyimpannya di mana pun Anda inginkan.

Mayank
sumber
Bagaimana cara memeriksa data yang diperbarui di Aplikasi dan server lokal? dan Bagaimana cara bergabung bersama? Itu tidak baik bahwa saya mengirim semua catatan oleh JSON atau apa pun ke aplikasi untuk menggabungkan mereka. Bagaimana menurut anda?
Omid Nazifi
2
Anda bisa menggunakan flag, seperti "di server" dengan int / bool 1/0 untuk ya atau tidak. ketika catatan / file / blok data dikirimkan, periksa keberhasilan di server, dan balikkan bit ke ya. maka jika Anda menggunakan sesuatu seperti SQLite, Anda dapat melakukan jenis ketik "SELECT * FROM my_table WHERE sent = 0" untuk mengirim catatan baru
Evan R.
1

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.

Neo
sumber
1

@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

Sean
sumber