2017-01-10 4 views
3

Firebase Realtime Databaseはオフラインサポートを提供していますが、オンライン接続で提供されるデータとローカルでオフラインで変更されるデータを区別するにはどうすればよいですか?Firebaseデータベースはオンラインとオフラインのデータを区別します

+0

オンラインデータを確実に読み取ることを目標にしている場合は、http://stackoverflow.com/questions/35454652/how-to-bypass-the-firebase-cache-to-refreshの複製です-data-in-android-app –

+0

あなたは解決策を見つけましたか? – Andrea

答えて

2

Firebaseデータベースは、クライアントが接続されているかどうかを特定する方法を提供します。

Googleは、このトピックに便利なdocumentationを書きました。

提供されたリンクから:

が多く存在関連機能について接続状態

を検出し、それがオンラインまたはオフラインのときに知っているクライアントのために有用です。 Firebase Realtime Databaseクライアントは、クライアントの接続状態が変わるたびに更新される特別な場所である/.info/connectedを提供します。

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     System.out.println("connected"); 
    } else { 
     System.out.println("not connected"); 
    } 
    } 
    @Override 
    public void onCancelled(DatabaseError error) { 
    System.err.println("Listener was cancelled"); 
    } 
}); 

/.info/connected値は、クライアントの状態に依存しているので、クライアント間で同期されませんブール値です。つまり、1つのクライアントが/.info/connectedをfalseと読み取る場合、別のクライアントもfalseを読み取るという保証はありません。

Androidでは、Firebaseが自動的に接続状態を管理し、帯域幅とバッテリの使用量を削減します。クライアントにアクティブなリスナーがなく、保留中の書き込みまたはonDisconnect操作がなく、goOfflineメソッドによって明示的に切断されていない場合、Firebaseは60秒間使用しないと接続を終了します。

クライアントがデータベースに接続しているかどうかを知ることで、オンラインとオフラインのストレージから提供されるデータを区別するのに役立ちます。 DataSnapshotがオンラインまたはオフラインデータから来るかどうかを確認する具体的な方法はないと私は確信しています。

+0

これは実際の方法ではありません。 "onConnected"コールバックの後に値をロードすることによってそれをテストし、最初にキャッシュされた(オフライン)値が返され、後で新しい(オンライン)値が返されます。 –

+2

アクティブなリスナーがない場合は、60秒間切断します。クライアントがインターネット/ firebase接続を持っているかどうかを調べ、falseの場合はネットワークエラーを表示するために、.info/connected referenceを聞いています。 firebaseはこの場合、.info/connectedのリスナーをアクティブなリスナとしては考慮していないようです。 –

関連する問題