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

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

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

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

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

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


person Samuel    schedule 16.11.2009    source источник
comment
Я не знаю, есть ли какие-либо библиотеки, но самый простой способ сделать это - сохранить временную метку модификации и передать изменения в записи, которые новее, чем записи на другой стороне, а также передать добавления и удаления с момента последней синхронизации. Это может сойти с ума, если локальные и серверные часы не синхронизированы, но вы что-нибудь придумаете. - Публикация в качестве комментария, поскольку она, вероятно, не очень полезна и не дает вам ответа.   -  person Ivan Vučica    schedule 08.01.2010
comment
Спасибо, Иван. Вы правы, если локальные и серверные часы не синхронизированы, это может быть беспорядочно ... Я только что обнаружил, что: quickconnect.pbworks.com/Using-Enterprise-Synchronization В нем говорится, что он может синхронизировать локальную базу данных HTML 5 с базой данных на сервере. Мне нужно глубже взглянуть на это и посмотреть, может ли он работать за пределами QuickConnect Framework ...   -  person Samuel    schedule 09.01.2010
comment
Я нашел другое решение: impel.simulacre.org/blog/ Выглядит отлично, но вы нужно будет использовать библиотеку Mootools и Impel ORM ...   -  person Samuel    schedule 31.05.2010
comment
Как насчет CouchDB? couchdb.apache.org   -  person julianm    schedule 03.12.2011
comment
Я не думаю, что он обеспечивает синхронизацию с WebSQL ...   -  person Samuel    schedule 13.12.2011
comment
Темы предназначены для обсуждений, Stack Exchange - для вопросов. В какой-то момент подобные сообщения принимались на Stack Exchange, но больше не принимались.   -  person casperOne    schedule 05.03.2013
comment
В Microsoft Access есть способ синхронизации строк с использованием уникального идентификатора типа хэша. Это может быть дополнительный уровень, включающий дату транзакции. Если это всего лишь одна таблица, это простая задача. Когда вы попадаете в несколько таблиц и зависимостей, это может быть беспорядочно.   -  person Sun    schedule 28.11.2013
comment
Вы можете отметить все автономные изменения или новые записи, сделанные в базе данных HTML5 (local). Процесс синхронизации просто повлияет на синхронизацию изменений на сервере, которые помечены как отключенные.   -  person Ljupco Sofijanov    schedule 29.04.2014
comment
Эти ответы устарели, посетите pouchdb.com   -  person J Chris A    schedule 05.08.2014
comment
@JChrisA Ваш комментарий не в тему, здесь речь идет о БД WebSQL   -  person Samuel    schedule 13.08.2014
comment
Есть ли какая-либо структура для синхронизации базы данных IndexDB с БД?   -  person Subin Chalil    schedule 09.12.2015


Ответы (2)


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

https://github.com/orbitaloop/WebSqlSync

  • Проект с открытым исходным кодом QuickConnect содержит библиотеку JS для синхронизации локальной базы данных HTML5 SQLite с серверной базой данных (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 DB SQLite или Google Gears на клиенте и MySQL на сервере)

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

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

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

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

person Community    schedule 22.02.2010
comment
Привет, Самуэль, у тебя сработала js lib? - person Mathias Conradt; 14.08.2010
comment
Синхронизация БД сейчас не является моим приоритетом, поэтому я просто сдаюсь, ожидая более стандартного и надежного решения ... - person Samuel; 18.08.2010
comment
поскольку стандарт WebSQL уже устарел (ссылка) и работа продолжаться не будет, я бы скорее ищите альтернативы, так как WebSQL, вероятно, не будет поддерживаться в будущих выпусках! - person Matthias B; 07.11.2011
comment
WebSQL используется в тысячах веб-приложений (даже Apple и Google используют его), поэтому я не думаю, что он скоро будет удален ... - person Samuel; 08.11.2011
comment
После тестирования всех из них, я думаю, что разработаю свою небольшую JS-библиотеку для синхронизации WebSQL с серверной БД. Это будет двойная синхронизация (локальный сервер ‹-›) и не будет никакой зависимости. Я отправлю сюда ссылку на код после завершения - person Samuel; 13.01.2012
comment
У меня была аналогичная ситуация с синхронизацией мобильных данных с корпоративной базой данных. Я использовал persistencejs и написал настраиваемую логику синхронизации на основе свойства строки sync / not-synced на сервере, как упоминал @samuel. - person dhaval; 01.02.2012
comment
Я выполнил первую версию своего собственного решения для синхронизации под названием WebSqlSync: github.com/orbitaloop/WebSqlSync ( см ниже ответ) - person Samuel; 02.02.2012
comment
Привет, ребята, я запустил плагин persistencejs для спокойной синхронизации. Он все еще находится в разработке, но если кто-то хочет его проверить: github.com/robertokl/persistencejs и рабочий пример на стороне сервера / клиента с рубином на рельсах: github.com/robertokl/persistencejs-restfulSync -пример - person robertokl; 09.08.2013
comment
Есть ли у вас что-нибудь подобное, но для localStorage, а не для WebSQL? - person ; 24.04.2014

Я разработал универсальное решение для синхронизации под названием 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. Опять же, взносы приветствуются.

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