Cara terbaik untuk menyinkronkan DB HTML5 lokal (Penyimpanan WebSQL, SQLite) dengan server (sinkronisasi 2 arah) [ditutup]

151

Saya mengembangkan aplikasi web seluler (untuk iPhone & Android) dengan basis data lokal (menggunakan penyimpanan HTML5) sehingga aplikasi saya masih dapat digunakan ketika pengguna sedang offline.

Ini berfungsi dengan baik, tetapi saya ingin menyimpan data lokal di server. Jadi saya perlu menyinkronkan DB lokal dengan DB di server. Sinkronisasi hanya bisa satu arah, tetapi di masa depan, saya ingin menyinkronkannya dengan cara yang sama (server <-> DB lokal).

Permintaan ini terlihat sangat umum (atau akan menjadi umum di masa depan untuk aplikasi web seluler), tetapi saya tidak dapat menemukan perpustakaan melakukan hal itu.

Saya tahu Google melakukan itu di aplikasi web seluler mereka (mis. Gmail), dan saya menemukan proyek WSPL proyek google tetapi tanpa sumber untuk diunduh.

Jika saya tidak dapat menemukan solusi, saya akan membuat perpustakaan untuk melakukan itu, karena satu cara sinkronisasi tidak terlihat sulit, tetapi saya ingin tahu apakah ada solusi lain.

Samuel
sumber
2
Saya tidak tahu apakah ada lib, tetapi cara termudah untuk melakukan ini tampaknya menyimpan cap waktu modifikasi, dan mentransfer perubahan ke catatan yang lebih baru dari catatan di sisi lain, dan juga mentransfer penambahan dan penghapusan sejak sinkronisasi terakhir. Mungkin gila jika jam lokal dan server tidak sinkron, tetapi Anda akan memikirkan sesuatu. - Posting sebagai komentar karena mungkin tidak terlalu membantu dan tidak memberi Anda jawaban.
Ivan Vučica
Terima kasih Ivan. Anda benar, jika jam lokal dan server tidak sinkron, itu bisa berantakan ... Saya baru saja menemukan bahwa: quickconnect.pbworks.com/Using-Enterprise-Synchronization Dikatakan itu dapat menyinkronkan HTML 5 DB lokal dengan DB di server. Saya perlu melihat lebih dalam tentang itu, dan melihat apakah itu dapat berjalan di luar Kerangka QuickConnect ...
Samuel
Saya menemukan solusi lain: impel.simulacre.org/blog/… Terlihat bagus, tetapi Anda perlu menggunakan perpustakaan Mootools, dan ORM Impel ...
Samuel
1
Bagaimana dengan CouchDB? couchdb.apache.org
julianm
4
Topik untuk diskusi , Stack Exchange untuk pertanyaan . Pada satu titik posting seperti ini diterima di Stack Exchange, tetapi tidak lagi.
casperOne

Jawaban:

70
  • Saya membuat JS lib kecil bernama WebSqlSync untuk menyinkronkan DB WebSql lokal dengan server (klien <-> server). Sangat mudah digunakan dan diintegrasikan dalam kode Anda:

https://github.com/orbitaloop/WebSqlSync

  • Proyek open source QuickConnect berisi perpustakaan JS untuk menyinkronkan DB HTMLite SQL5 lokal ke DB server (MySQL atau lainnya):

http://quickconnect.pbworks.com/Using-Enterprise-Synchronization

Untuk menggunakan lib ini, Anda perlu menggunakan DataAccessObject dari framework untuk mengakses DB Anda. Ia bekerja dengan menyimpan semua permintaan SQL yang diterapkan ke DB (kecuali pilih tentu saja), dan mengirimkannya ke server. Sangat bagus untuk mengelola penghapusan, tetapi agak berat jika Anda memiliki banyak pembaruan, dan server perlu menggunakan bahasa SQL yang sama ...

  • Proyek lain dari QuickConnect adalah sinkronisasi SQLite asli (di Objective C untuk iOS atau Mac OS dan di Java untuk Android):

http://www.quickconnectfamily.org/qcdbsync/ (Saya pikir ini menyimpan juga sejarah semua permintaan SQL)

  • Dan saya baru saja menemukan perpustakaan JS lain yang menjanjikan: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js adalah pustaka mapper-relasional Javascript hubungan-asinkron yang asinkron. Anda dapat menggunakannya di browser, juga di server (dan Anda dapat berbagi model data di antara mereka)."

Mereka memiliki modul sinkronisasi DB: DOC of persistence.synch.js

(berfungsi dengan HTML5 DB SQLite atau Google Gears di klien, dan MySQL di server)

  • Dan ada juga Impel.inTouch . Ini terlihat sangat mudah digunakan (dengan menyertakan file php), tetapi Anda harus menggunakan kerangka Mootools di sisi klien:

http://impel.simulacre.org/api/Impel.inTouch

  • Sencha juga memiliki layanan sinkronisasi: Sencha.io . Terlihat bagus, tapi itu tergantung dari kerangka kerja Sencha Touch:

http://www.sencha.com/products/io/

Samuel
sumber
Hai Samuel, apakah js lib berhasil untuk Anda?
Mathias Conradt
Sinkronisasi DB bukan prioritas saya untuk saat ini, jadi saya menyerah, menunggu solusi yang lebih standar dan kuat ...
Samuel
3
Setelah menguji semuanya, saya pikir saya akan mengembangkan JS lib kecil saya sendiri untuk menyinkronkan WebSQL dengan DB server. Ini akan menjadi sinkronisasi ganda (server <-> lokal) dan tidak akan memiliki ketergantungan. Saya akan memposting di sini tautan ke kode setelah selesai
Samuel
2
Saya telah melakukan versi pertama dari solusi sinkronisasi saya sendiri bernama WebSqlSync: github.com/orbitaloop/WebSqlSync (lihat jawaban di bawah)
Samuel
1
Hai Teman-teman, saya sudah memulai plugin persistencejs untuk sinkronisasi yang tenang. Itu masih dalam pengembangan, tetapi jika ada yang ingin memeriksanya: github.com/robertokl/persistencejs dan contoh yang berfungsi di sisi server / klien dengan ruby ​​on rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

Saya telah mengembangkan solusi sinkronisasi umum yang disebut WebSqlSync .

Itu tidak tergantung pada kerangka apa pun. Ini tersedia di sini: https://github.com/orbitaloop/WebSqlSync

Ekstrak file README:

WebSqlSync

Secara otomatis menyinkronkan database WebSql lokal (SQLite di navigator) ke server. (Sinkronisasi 2 arah: klien <-> server)

Sangat mudah diintegrasikan ke aplikasi Anda yang sudah ada dan sangat mudah digunakan (2 fungsi untuk dipanggil: initSync dan syncNow)

Pemakaian

Inisialisasi

Anda perlu menginisialisasi lib (di setiap startup misalnya).

Secara otomatis akan membuat 2 tabel (jika belum ada, satu untuk menyimpan semua elemen baru atau yang dimodifikasi (tabel new_elem) dan satu untuk menyimpan tanggal sinkronisasi terakhir (tabel sync_info). Itu juga akan membuat pemicu SQLite di untuk menonton INSERT atau UPDATE pada tabel yang ingin Anda sinkronkan (untuk secara otomatis memasukkan elemen yang dimodifikasi di tabel new_elem):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);

Di mana TABLES_TO_SYNC adalah daftar tabel yang ingin Anda sinkronkan dengan server, mis:

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];

Sinkronkan

Untuk memulai sinkronisasi, Anda perlu memanggil fungsi syncNow. Anda dapat memanggilnya setiap X detik, atau setelah beberapa perubahan misalnya:

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});

Dan itu semua yang perlu Anda lakukan pada klien. Di sisi server, Anda perlu kode solusi Anda sendiri (tetapi tidak rumit). Dan ada beberapa contoh diPHP & Java. Sekali lagi, kontribusi diterima.

Samuel
sumber
Seberapa baik Anda mengatakan ini bekerja untuk Anda, meringkasnya setahun kemudian? Saya mencari DB sisi klien yang bagus yang berfungsi untuk browser dan unit seluler.
Niklas
1
WebSQLSync bekerja dengan sangat baik dengan produksi lebih dari 25 aplikasi (iOS dan Android). WebSQL sangat bagus dan cepat. Ini bekerja di iOS, Android, Blackberry (versi terbaru saya pikir) dan tentu saja chrome dan safari. Tapi itu tidak berfungsi pada IE dan firefox, karena API telah didepresiasi oleh W3C ..
Samuel
Baiklah, baik positif maupun negatif di sana. Terima kasih untuk rekapnya!
Niklas
2
Apakah Anda memiliki sesuatu yang serupa tetapi untuk localStorage dan bukan WebSQL?