Лучший способ синхронизировать локальную базу данных HTML5 (хранилище WebSQL, SQLite) с сервером (двухсторонняя синхронизация)
Я занимаюсь разработкой мобильного веб-приложения (для iPhone и Android) с локальной базой данных (с использованием веб-хранилища html5), поэтому мое приложение все еще можно использовать, когда пользователь находится в автономном режиме.
Это работает отлично, но я хочу сохранить локальные данные на сервере. Поэтому мне нужно синхронизировать локальную БД с БД на сервере. Синхронизация может быть только одним способом, но в будущем я хотел бы синхронизировать его в обоих направлениях (сервер <-> локальная БД).
Этот запрос выглядит очень распространенным (или будет распространен в будущем для мобильного веб-приложения), но я не могу найти библиотеку, делающую это.
Я знаю, что Google делает это в своем мобильном веб-приложении (например, gmail), и я нашел проект WSPL проектом Google, но без источника для загрузки.
Если я не могу найти решение, я создам для этого библиотеку, так как односторонняя синхронизация не выглядит сложной, но мне интересно, есть ли другие решения.
2 ответа
- Я создал небольшую библиотеку JS с именем WebSqlSync для синхронизации локальной базы данных WebSql с сервером (клиент <-> сервер). Очень прост в использовании и интеграции в ваш код:
https://github.com/orbitaloop/WebSqlSync
- Проект с открытым исходным кодом QuickConnect содержит библиотеку JS для синхронизации локальной БД SQLite HTML5 с БД сервера (MySQL или другой):
http://quickconnect.pbworks.com/Using-Enterprise-Synchronization
Чтобы использовать эту библиотеку, вам нужно использовать DataAccessObject платформы для доступа к вашей БД. Он работает, сохраняя все запросы SQL, примененные к БД (кроме, конечно, select), и отправляя их на сервер. Замечательно управлять удалением, но это немного тяжело, если у вас много обновлений, и сервер должен использовать тот же язык 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. Вы можете использовать ее как в браузере, так и на сервере (и вы можете делиться моделями данных между ними)."
У них есть модуль синхронизации с БД: DOC of persistence.synch.js
(работает с HTML5 БД SQLite или Google Gears на клиенте и MySQL на сервере)
- И есть также Impel.inTouch. Он выглядит очень простым в использовании (с включенными php-файлами), но вы должны использовать инфраструктуру Mootools на стороне клиента:
http://impel.simulacre.org/api/Impel.inTouch
- У Sencha также есть служба синхронизации: Sencha.io. Выглядит отлично, но это зависит от платформы Sencha Touch:
Я разработал универсальное решение для синхронизации под названием WebSqlSync.
Это не зависит от каких-либо рамок. Это доступно здесь: https://github.com/orbitaloop/WebSqlSync
Извлечение файла README:
WebSqlSync
Автоматически синхронизировать локальную базу данных WebSql (SQLite в навигаторе) с сервером. (2 способа синхронизации: клиент <-> сервер)
Очень легко интегрируется в существующее приложение и очень прост в использовании (для вызова 2 функции: initSync и syncNow)
использование
инициализировать
Вам нужно инициализировать библиотеку (например, при каждом запуске).
Он автоматически создаст 2 таблицы (если они еще не существуют, одну для хранения всех новых или измененных элементов (таблица 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's "id"
];
синхронизировать
Чтобы начать синхронизацию, вам нужно вызвать функцию syncNow. Вы можете вызывать его каждые X секунд или после некоторых изменений, например:
DBSYNC.syncNow(callBackSyncProgress, function(result) {
if (result.syncOK === true) {
//Synchronized successfully
}
});
И это все, что вам нужно сделать на клиенте. На стороне сервера вам нужно будет написать собственное решение (но это не сложно). И есть несколько примеров в PHP и Java. Опять же, взносы приветствуются.