Firebaseを使用して、PhoneGapとHTML5アプリケーションキャッシュを使用するモバイルアプリを書くことを考えています。
各ユーザーがTODOアイテムのリストを持っているとしましょう。スマートフォンがオフラインのときにアプリを起動した場合、前回のセッションからデータを読み込んで、接続が確立されたときに同期できますか?もしそうなら、私はfirebase.jsでlocalStorageへの参照を見つけることができなかったので、これがどのように実装されているのか疑問に思っています。
簡単に言えば、まだです。
アプリがFirebaseに接続すると、クライアントはデータをローカルにキャッシュし、ネットワーク接続が失われた後でも、未処理の「オン」コールバックがあるデータにアクセスできるようになります。ただし、このデータはディスクに保持されないため、「オフラインモード」はアプリが実行されている間のみ機能します。
将来的には完全なオフラインサポートが提供されます。
edit 2016:ネイティブiOSおよびAndroidアプリ: https:/ /www.firebase.com/blog/2015-05-29-announcing-mobile-offline-support.html
JSアプリのこの問題を解決するFirebaseの代替は、CouchDb(サーバー)<=> PouchDb(JSクライアント)です。ナイスクリーンクライアントサイドサービスレイヤーを実装している場合、PouchDbへの移植はどちらもNoSQL/JSONデータベースであるため、かなり簡単です。 CouchDbは、インデックス付きのmap/reduceビューもサポートしています。
PouchDbは、完全にオフラインのCouchDbクライアントを実装するJavascript APIです。 local storage、IndexDbまたはWebSQLのいずれかを自動検出して使用できますオンラインまたはオフラインでローカルデータを永続的に保持します。 PouchDb APIを使用して、ローカルまたはリモートのデータベースにアクセスし(URLを変更するだけ)、2つの間の完全な同期またはフィルターされた同期を接続できます。 AngularJSのQ promise APIをサポートするために、多くの便利なPouchDbプラグイン、コードサンプル、小さなラッパーライブラリがあります。
PouchDbを使用すると、オフラインでアプリを安全に起動し、数日後にアプリを再起動して、すべてのCUDデータの変更をサーバーに同期できます。これにより更新の衝突が発生する可能性があるため、CouchDbはこれを検出して追跡するように設計されたレコードのバージョン管理をサポートします。したがって、これらの衝突を解決するには、サーバー側のロジックが必要になる可能性があります。これは、オフライン同期とCouchDbの主要機能を備えた分散システムでは避けられません。 FirebaseがこのMVCC機能をサポートしているかどうかはわかりません。
PouchDbは基本的に、その同期プロトコルを含むApache CouchDbの再実装です。 CouchDbとPouchDbはどちらも十分にテストされた無料のオープンソースです。オープンソースであることは、CouchDbサーバーをイントラネットサービスとしてデプロイすることもでき、オプションで外部クラウドサービスと同期することを意味します。多くのCouchDbホスティングプロバイダーがあります。
IBMのCloudantホスティングチームは最近、BigCouchクラスタリング機能をApache CouchDb 2.0プロジェクトに追加したため、マイクロDb(PouchDb)=>シングルサーバー=>マルチマスター(レプリケート)=> Big Couchクラスター/ Geoクラスターからスケーリングできます。 MongoDbとは異なり、CouchDbは単一サーバーのデプロイメントを安全にサポートします。
注:PouchDbは、同じプロトコルを使用してCouchBaseと同期することもできますが、Couchbase!== CouchDbです。市販品です。
別のクールなトリックは、CouchDbの代わりとしてPouchDbをNodeJSサーバー内で実行できることです。 (まだ)本番で使用する準備は整っていませんが、単体テストには非常に便利です。 express-pouchdb を参照してください。
CouchDbに移行する際に考慮する必要がある1つの問題は、アクセス制御モデルがより制限されていることです。これは部分的にはその複製アルゴリズムによるものです。このブログ記事では、これについて詳しく説明しています(realの決定的なガイドよりも優れています)。
実際には、パフォーマンスが非常に高いため、PouchDBストレージにWebSQLを使用することをお勧めします。 -これがストレージアダプタの 詳細です
多種多様なPouchDbコミュニティからオープンソースの扉を常に飛び出させる、驚くほど多くの新しいクールな「クリスマスツリー」グッズがあります。
PouchDbの最高の機能の1つは、すべてのオープンソース plugins (37)とUIフレームワークアダプター(12)です。
非常に古い質問ですが、まだ問題が解決しません。私は数日間だけFirebaseを使用しており、この問題に対する満足のいく解決策を自分で見つけることができなかったので、自分がやったことを共有したいと思いました。
アプリの起動時に、オンラインかどうかを確認しますnavigator.onLine
。そうでない場合は、ローカルストレージから読み取り、Firebase参照をそこから復元します。
export const firebaseFromLocalStorage = (local, storeRef) => {
// assuming data is array
const localData = JSON.parse(localStorage.getItem(local)) || []
localData.map(obj => {
const key = obj['.key']
delete obj['.key']
storeRef
.child(key)
.set(obj)
})
}
次に、通常どおり続行します。アプリがオンラインになると、オンラインで起動して一時的に接続が失われるのと同じように、ローカル状態がサーバーと同期されます。
もちろん、これはlocalStorageをFirebaseの参照と同期させる必要があることを意味します。 get操作ごとにこれを行います。
お役に立てれば