Лучший способ синхронизации локальной базы данных HTML5 (WebSQL Storage, SQLite) с сервером (двухсторонняя синхронизация)

Я разрабатываю мобильное веб-приложение (для iPhone и Android) с локальной базой данных (используя html5 webstorage), поэтому мое приложение по-прежнему можно использовать, когда пользователь отключен.

Это работает отлично, но я хочу сохранить локальные данные на сервере. Поэтому мне нужно синхронизировать локальную БД с БД на сервере. Синхронизация может быть только одним способом, но в будущем я хотел бы синхронизировать ее в обоих направлениях (server ↔ local DB).

Это требование очень распространено (или будет распространено в будущем для мобильного веб-приложения), но я не могу найти библиотеку, которая делает это.

Я знаю, что Google делает это в своем мобильном веб-приложении (например, gmail), и я нашел проект

Ответ 1

  • Я создал небольшую JS-библиотеку с именем WebSqlSync, чтобы синхронизировать локальную базу данных WebSql с сервером (client ↔ server). Очень проста в использовании и для интеграции в ваш код:

https://github.com/orbitaloop/WebSqlSync

  • Проект с открытым исходным кодом QuickConnect содержит библиотеку JS для синхронизации локальной базы данных SQL5 SQL5 с сервером DB (MySQL или другим):

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

Чтобы использовать эту библиотеку, вам необходимо использовать DataAccessObject структуры для доступа к вашей БД. Он работает, сохраняя все запросы SQL, применяемые к БД (за исключением выбора конечно), и отправляя их на сервер. Замечательно управлять удалением, но это немного тяжело, если у вас много обновлений, и серверу нужно использовать тот же язык SQL...

  • Другой проект из QuickConnect - это родная синхронизация SQLite (в Objective C для iOS или Mac OS и Java для Android):

http://www.quickconnectfamily.org/qcdbsync/ (Я думаю, что он хранит также историю всех запросов SQL)

  • И я нашел еще одну многообещающую библиотеку JS: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js - это асинхронная Javascript-объектно-реляционная библиотека карт, которую вы можете использовать в браузере, а также на сервере (и вы можете совместно использовать модели данных между ними). ​​

У них есть модуль синхронизации DB: DOC of persistence.synch.js

(работает с HTML5 DB SQLite или Google Gears на клиенте и MySQL на сервере)

  • И есть Impel.inTouch. Он выглядит очень прост в использовании (с включенными файлами php), но вы должны использовать среду Mootools на стороне клиента:

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

  • Sencha также имеет службу синхронизации: Sencha.io. Выглядит отлично, но это зависит от рамки Sencha Touch:

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

Ответ 2

Я разработал общее решение синхронизации, называемое WebSqlSync.

Это не зависит от какой-либо структуры. Он доступен здесь: https://github.com/orbitaloop/WebSqlSync

Извлечение файла README:

WebSqlSync

Автоматическая синхронизация локальной базы данных WebSql (SQLite в навигаторе) с сервером. (Двухсторонняя синхронизация: клиент ↔ сервер)

Очень простая интеграция с вашим существующим приложением и очень простая в использовании (2 функции для вызова: initSync и syncNow)

Использование

Initialize

Вам нужно инициализировать lib (например, при каждом запуске).

Он автоматически создаст 2 таблицы (если они еще не существуют, одна для хранения всех новых или измененных элементов (table new_elem) и одна для хранения даты последней синхронизации (таблица sync_info). Она также создаст SQLite, чтобы смотреть INSERT или UPDATE в таблицах, которые вы хотите синхронизировать (чтобы автоматически вставлять измененные элементы в таблицу new_elem):

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

Где TABLES_TO_SYNC - это список таблиц, которые вы хотите синхронизировать с сервером, например:

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

Синхронизировать

Чтобы запустить синхронизацию, вам нужно вызвать функцию syncNow. Вы можете вызвать его каждые X секунд или после некоторых изменений, например:

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

И все, что вам нужно сделать на клиенте. На стороне сервера вам нужно будет написать собственное решение (но это не сложно). И есть несколько примеров inPHP и Java. Опять же, приветствуются вклады.