Найкращий спосіб синхронізувати локальний HTML5 DB (WebSQL Storage, SQLite) з сервером (двостороння синхронізація) [закрито]


151

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

Це працює чудово, але я хочу зберегти локальні дані на сервері. Тому мені потрібно синхронізувати локальну БД з БД на сервері. Синхронізація може бути лише одним способом, але в майбутньому я хотів би синхронізувати її обома способами (сервер <-> локальна БД).

Цей запит виглядає дуже часто (або буде в майбутньому загальним для мобільних веб-додатків), але я не можу знайти бібліотеку, яка б це робила.

Я знаю, що Google це робить у своєму мобільному веб-додатку (наприклад, gmail), і я знайшов проект WSPL google-проект, але без джерела для завантаження.

Якщо я не можу знайти рішення, я створити бібліотеку для цього, оскільки один спосіб синхронізації не виглядає складно, але мені цікаво, чи є інші рішення.


2
Я не знаю, чи є ліб, але найпростішим способом зробити це, здається, є збереження часової позначки модифікації та перенесення змін до записів, які новіші, ніж записи з іншого боку, а також перенесення доповнень та видалень з моменту останньої синхронізації. Це може зійти з розуму, якщо локальні та серверні годинники не синхронізуються, але ви щось придумаєте. - Публікація як коментар, оскільки це, мабуть, не дуже корисно і не дає відповіді.
Іван Вучиця

Дякую Іване. Ви маєте рацію, якщо локальні та серверні годинники не синхронізовані, це може бути безладним ... Я щойно встановив, що: quickconnect.pbworks.com/Using-Enterprise-Synchronization У ньому написано, що він може синхронізувати локальний HTML 5 DB із БД на сервері. Мені потрібно глибше подивитися на це і подивитися, чи може він працювати поза рамками QuickConnect Framework ...
Самуїл

Я знайшов інше рішення: impel.simulacre.org/blog/… Виглядає чудово, але вам потрібно буде скористатися бібліотекою Mootools та ORM Impel ...
Самуїл,

1
Як щодо CouchDB? couchdb.apache.org
julianm

4
Теми для обговорення , обмін стеками - для запитань . Одного разу такі повідомлення були прийняті на Stack Exchange, але вже не.
casperOne

Відповіді:


70
  • Я створив невелику ліцензію JS на ім'я WebSqlSync, щоб синхронізувати локальний БД WebSql із сервером (клієнт <-> сервер). Дуже простий у використанні та інтеграції у свій код:

https://github.com/orbitaloop/WebSqlSync

  • Проект QuickConnect з відкритим кодом містить бібліотеку JS для синхронізації локальної БД HTML SQLite HTML5 до БД сервера (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: persistentJS

https://github.com/zefhemel/persistencejs

"persistent.js - це асинхронна бібліотека об'єктивних реляційних об'єктів Javascript. Ви можете використовувати її в браузері, а також на сервері (і ви можете ділитися моделями даних між ними)."

Вони мають модуль синхронізації БД: 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/


Привіт, Самюеле, чи працював для тебе js lib?
Матіас Конрадт

Синхронізація БД зараз не є моїм пріоритетом, тому я просто здаюсь, чекаючи більш стандартного та надійного рішення ...
Самуїл

3
Після тестування всіх їх, я думаю, я буду розробляти власну невелику JS lib для синхронізації WebSQL з сервером БД. Це буде подвійний синхронізатор (локальний <-> сервер) і не матиме ніякої залежності. Я опублікую тут посилання на код після закінчення
Самуель

2
Я започаткував першу версію мого власного рішення для синхронізації під назвою WebSqlSync: github.com/orbitaloop/WebSqlSync (див. Нижче відповідь)
Самуїл

1
Привіт, хлопці, я створив плагін persistentjs для спокійної синхронізації. Він ще в розробці, але якщо хтось хоче перевірити це: github.com/robertokl/persistencejs та робочий приклад на стороні сервера / клієнта з рубіном на рейках: github.com/robertokl/persistencejs-restfulSync-example
robertokl

18

Я розробив загальне рішення для синхронізації під назвою WebSqlSync .

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

Витяг з файлу README:

WebSqlSync

Автоматично синхронізувати локальну базу даних WebSql (SQLite в навігаторі) на сервер. (Двостороння синхронізація: клієнт <-> сервер)

Дуже проста інтеграція до наявного додатку та дуже проста у використанні (2 функції для виклику: initSync та syncNow)

Використання

Ініціалізуйте

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

Він автоматично створить 2 таблиці (якщо їх вже не існує, одна для зберігання всіх нових або модифікованих елементів (таблиця new_elem) і одна для зберігання дати останньої синхронізації (таблиця sync_info). Також буде створено тригери SQLite в для того, щоб переглянути ВСТУП або ОНОВЛЕННЯ в таблицях, які ви хочете синхронізувати (щоб автоматично вставити змінені елементи в таблицю 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
     }
});

І це все, що вам потрібно зробити на клієнті. На стороні сервера вам потрібно буде кодувати власне рішення (але це не складно). І є приклад inPHP та Java. Знову ж таки, внески вітаються.


Як би ви сказали, що це спрацювало для вас, підсумовуючи це через рік? Я шукаю хороший клієнтський БД, який працює для браузерів та мобільних підрозділів.
Ніклас

1
WebSQLSync дуже добре працює з більш ніж 25 додатками у виробництві (iOS та Android). WebSQL - це справді чудово і швидко. Це працює на iOS, Android, Blackberry (остання версія, на яку я думаю), і звичайно на хром і сафарі. Але це не працює на IE та firefox, тому що API знецінився на W3C ..
Самуель

Гаразд, і позитивні, і негативні. Дякую за резюме!
Ніклас

2
У вас є щось подібне, але не для localStorage, а не WebSQL?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.