は、次の例を考えてみましょう:Firebaseデータベース:クライアントがオフラインの場合は明らかにルールが適用されません。
私はtest/
ノードに値を書いている、と私は唯一の「(新しい値)場合、書き込みを許可するルールを、設定しているが(古い値+ 1に等しいです。 ) "であり、newData.val() == data.val() + 1
test/
ノードの初期値は0
であるとします。
クライアントがオフラインになり、次のコマンドを実行した場合:彼は再びオンラインになったとき
testRef.setValue(1);
testRef.setValue(2);
testRef.setValue(3);
testRef.setValue(4);
testRef.setValue(5);
はその後、値5
は、データベースに書き込まれますが、私は理由を理解していません、5 != 0 + 1
以降です。私はこれがローカルデータベースの以前の値のキャッシュのために起こったと思いますが、残念ながらそれは私が達成しようとしている結果ではありません。私はそれがデータベースのルールに従わないので、サーバーがその値を拒否したい。
これを達成する方法はありますか?
またはその他の回避策があり、私は次のように実装することができるように:
testRef.setValue(1);
- >書き込み値ローカルデータベースへ - > - >チェック値がをオンラインデータベースの規則に従っている場合値がルールに従わない場合、またはオフラインになっていることを確認できない場合は、ローカルデータベースから値を削除してください。
インターネット接続が不足しているため、ルールを検証できない場合は、個人的にローカルキャッシュから値を削除することをお勧めします。私が必要とする理由は、私が共同アプリケーションを開発しているためであり、いくつかのノードには1人以上のユーザーがアクセスできるからです。いずれにしても、インターネット接続がない場合、ローカルキャッシュから値を削除するための回避策がありますか?何かタイムアウトのようなもの? (サーバーが5秒間到達できない場合は、キャッシュから保留中のすべての書き込み/ローカル値を削除してください) – MScott
AFAIK保留中の書き込みを削除するAPIはありません。Firebaser FvPからこの回答を参照してください:http://stackoverflow.com/a/34625545/4815718。あなたができることは、[接続状態を監視する](https://firebase.google.com/docs/database/android/offline-capabilities#section-connection-state)だけで、書き込みを許可することです接続時。 –