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

151

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

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

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

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

Если я не могу найти решение, я создам для этого библиотеку, так как односторонняя синхронизация не выглядит сложной, но мне интересно, есть ли другие решения.

Самуил
источник
2
Я не знаю, есть ли какие-нибудь библиотеки, но проще всего это сохранить временную метку модификации и перенести изменения в записи, которые новее, чем записи на другой стороне, а также перенести добавления и удаления со времени последней синхронизации. Это может сойти с ума, если локальные и серверные часы не синхронизированы, но вы что-нибудь придумаете. - Публикация в качестве комментария, так как это, вероятно, не очень полезно и не дает вам ответ.
Иван Вучица
Спасибо Иван. Вы правы, если локальные и серверные часы не синхронизированы, это может быть грязно ... Я просто обнаружил, что: quickconnect.pbworks.com/Using-Enterprise-Synchronization Он говорит, что может синхронизировать локальную БД HTML 5 с БД на сервере. Мне нужно глубже взглянуть на это и посмотреть, может ли он работать за пределами QuickConnect Framework ...
Сэмюэль,
Я нашел другое решение: impel.simulacre.org/blog/… Отлично выглядит, но вам нужно будет использовать библиотеку Mootools и Импел ORM ...
Самуил,
1
Как насчет CouchDB? couchdb.apache.org
Julianm
4
Темы для обсуждений , Stack Exchange для вопросов . В какой-то момент подобные сообщения были приняты на Stack Exchange, но больше не принимаются.
casperOne

Ответы:

70
  • Я создал небольшую библиотеку 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:

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

Самуила
источник
Привет, Сэмюэль, JS lib сработал для тебя?
Матиас Конрадт
Синхронизация с БД на данный момент не является моим приоритетом, поэтому я просто сдаюсь, ожидая более стандартного и надежного решения ...
Сэмюэль
3
После тестирования всех их, я думаю, что я разработаю свою собственную маленькую библиотеку JS для синхронизации WebSQL с серверной БД. Это будет двойная синхронизация (локальный <-> сервер) и не будет зависеть. Я выложу здесь ссылку на код после завершения
Самуил
2
Я отправил первую версию своего собственного решения для синхронизации с именем WebSqlSync: github.com/orbitaloop/WebSqlSync (см. Ответ ниже)
Самуил,
1
Привет, ребята, я запустил плагин persistencejs для спокойной синхронизации. Он все еще находится в разработке, но если кто-то захочет проверить это: github.com/robertokl/persistencejs и рабочий пример на стороне сервера / клиента с ruby ​​на рельсах: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

Я разработал универсальное решение для синхронизации под названием WebSqlSync .

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

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

WebSqlSync

Автоматически синхронизировать локальную базу данных WebSql (SQLite в навигаторе) с сервером. (2 способа синхронизации: клиент <-> сервер)

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

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

Initialize

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

Он автоматически создаст 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. Опять же, взносы приветствуются.

Самуил
источник
Насколько хорошо вы бы сказали, что это сработало для вас, подытожив это год спустя? Я ищу хорошую клиентскую БД, которая работает для браузеров и мобильных устройств.
Никлас
1
WebSQLSync очень хорошо работает с более чем 25 приложениями (iOS и Android). WebSQL действительно хорош и быстр. Он работает на iOS, Android, Blackberry (последняя версия, я думаю) и, конечно, Chrome и Safari. Но он не работает на IE и Firefox, потому что W3C обесценил API.
Сэмюэль
Хорошо, как положительные, так и отрицательные стороны. Спасибо за резюме!
Никлас
2
Есть ли у вас что-нибудь подобное, кроме localStorage, а не WebSQL?