2016-12-31 11 views
0

:オフライン(Firebase setOffline()) Firebase setOffline()およびオフラインのデータを読み込む(アンドロイド)

  • は、ローカルデータを読み取ることはできませんが登録されていない

    1. ユーザーは、私が(データを保存するリストビューなどを投入) - ValueEventListenerChildEventListener
    2. いけない私は、データがある
    3. Firebaseインスタンス上setOnline()を設定しますwebと同期して表示(リスナーの火)
    4. setOffline()を再度設定しました。
    5. 私は

    質問ローカルデータを保存し、ローカルデータを読み、作品(リスナー火):

    オンライン行く前に保存されたローカルデータを読み取る方法を?

    シナリオは次のとおりです。ユーザーは、Androidアプリをオフラインで使用して登録して後で決める

    シナリオ1:

    私はこれにコードを変更し、実行シナリオ1の後
    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
    FirebaseDatabase.getInstance().goOffline(); // <--------NOTE THIS 
    
    DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
    mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         // THIS IS NOT FIRING 
        } 
    
        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         ... 
        } 
    }); 
    

    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
    FirebaseDatabase.getInstance().goOnline(); // <--------NOTE THIS 
    
    DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
    mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         // THIS IS FIRING. ALL GOOD 
        } 
    
        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         ... 
        } 
    }); 
    

    これ以降、私はコードを次のように変更して動作します。

    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
    FirebaseDatabase.getInstance().goOffline(); // <--------NOTE THIS 
    
    DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
    mDatabase.child("users").child(App.get().getUid()).child("items").addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         // THIS IS FIRING. ALL GOOD 
        } 
    
        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         ... 
        } 
    }); 
    

    3つのセグメント(コードブロック)を追加しました。

  • 第二のブロックを動作しません - -

    • 私は、最初のブロックを実行
    • 第3のブロックに動作します - gist with the codeです。ここ

    に動作します。

    問題は、最初のブロックはsetOnline(とオンラインになる前に動作しないということである)

  • +0

    申し訳ありませんが、あなたの説明を解析するのに苦労しています。スニペットとして問題を再現するコードを表示できますか? –

    +0

    https://gist.github.com/ramden/3addea21cf925ecd3c8c380f78679ad9 – ramden

    +0

    ありがとうございます。私はリンクに腐敗する傾向があるので、質問に追加しました。シナリオ1では、データを同期させる前にクライアントを強制的にオフラインにするので、実際にはそのシナリオでは 'onDataChange()'を起動しないと予想しています。 3番目の断片では、ローカルキャッシュにデータを同期させる機会があったため、それは起動します。 –

    答えて

    1

    それは、任意のデータを同期する機会を持つ前に、シナリオ1でオフラインにクライアントを強制するので、私は確かにしないようにそれを期待そのシナリオでonDataChange()を発砲してください。 3番目のフラグメントでは、ローカルキャッシュにデータを同期させる機会があったため、起動します。

    しかし、なぜあなたは明示的にオンライン/オフライン状態を管理しようとしていますか?これを行うことで、あなたは逃げるのが難しいかもしれない穴を掘っています。

    ユーザーがサインインしないようにするには、匿名認証を開始してから、後で電子メール/パスワードまたはソーシャルアカウントにアップグレードすることができます。

    オフラインで起動して後で同期を有効にするだけでは、主にオフラインで作業を続けるオンラインデータベースであるFirebaseデータベースを使用する理想的な方法ではありません。

    関連する問題