web-dev-qa-db-ja.com

ローカルHTML5 DB(WebSQLストレージ、SQLite)をサーバーと同期する最良の方法(2方向同期)

ローカルデータベース(html5 webstorageを使用)を使用してモバイルWebアプリケーション(iPhoneおよびAndroid用)を開発しているため、ユーザーがオフラインでもアプリを使用できます。

これは完全に機能していますが、ローカルデータをサーバーに保存したいです。したがって、ローカルDBをサーバー上のDBと同期する必要があります。同期は一方向にしかできませんが、将来的には双方向(サーバー<->ローカルDB)で同期したいと思います。

この要件は非常に一般的です(またはモバイルWebアプリでは今後一般的になります)が、それを行うライブラリが見つかりません。

GoogleがモバイルWebアプリ(例:gmail)でそれを行っていることを知っています。そして、 WSPLプロジェクト googleプロジェクトですが、ダウンロードするソースがありません。

解決策が見つからない場合は、同期をとるのが難しくないように、それを行うためのライブラリを作成しますが、他の解決策があるのではないかと思います。

150
Samuel
  • WebSqlSyncという名前の小さなJSライブラリを作成して、ローカルWebSql DBをサーバー(クライアント<->サーバー)と同期させました。非常に使いやすく、コードに統合できます。

https://github.com/orbitaloop/WebSqlSync

  • オープンソースプロジェクトQuickConnectには、ローカルHTML5 SQLite DBをサーバーDB(MySQLまたはその他)に同期するJSライブラリが含まれています。

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

このライブラリを使用するには、フレームワークのDataAccessObjectを使用してDBにアクセスする必要があります。 DBに適用されたすべてのSQL要求(もちろんselectを除く)を保存し、それらをサーバーに送信することで機能します。削除を管理するのは素晴らしいことですが、大量の更新があり、サーバーが同じSQL言語を使用する必要がある場合は少し重いです...

  • QuickConnectの別のプロジェクトは、ネイティブのSQLite同期です(iOSまたはMac OSのObjective CおよびAndroidのJava):

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/

71
Samuel

WebSqlSyncと呼ばれる一般的な同期ソリューションを開発しました。

フレームワークに依存していません。ここにあります: https://github.com/orbitaloop/WebSqlSync

READMEファイルの抽出:

WebSqlSync

ローカルWebSqlデータベース(ナビゲーターのSQLite)をサーバーに自動的に同期します。 (2方向の同期:クライアント<->サーバー)

既存のアプリへの統合が非常に簡単で使いやすい(2つの関数呼び出し:initSyncとsyncNow)

使用法

初期化

Libを初期化する必要があります(たとえば、各起動時に)。

自動的に2つのテーブルを作成します(まだ存在していない場合、1つはすべての新規または変更された要素を保存し(テーブルnew_elem)、もう1つは最後の同期の日付を保存します(テーブルsync_info)。同期するテーブルの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にはいくつかの例があります。繰り返しますが、貢献は大歓迎です。

18
Samuel