2017-10-23 4 views
18

Firestore Databaseからデータを削除した後、データが削除されたことを認識するまでに私のAndroidappがしばらく時間がかかり、自動データキャッシュのために起こっていると思います。Firestoreでオフラインデータを無効にできない

は、私は私のカスタムApplication Classでこれを追加した...私のアプリはオフラインでの使用状況とは関係ありませんし、私はこの機能を無効にしたいと思います。問題は、インターネット接続をオフにした後に発生

import android.app.Application; 
import com.google.firebase.firestore.FirebaseFirestore; 
import com.google.firebase.firestore.FirebaseFirestoreSettings; 

public class ApplicationClass extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     FirebaseFirestore db=FirebaseFirestore.getInstance(); 
     FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() 
       .setPersistenceEnabled(false) 
       .build(); 
     db.setFirestoreSettings(settings); 
    } 
} 

アプリがまだ実行中にがバックグラウンドで実行されていないか、Firestore moduleがサーバーとの接続が失われているように見えて、の代わりにの代わりにキャッシュからデータを取り出すと、キャッシュからデータを取ります。のみ

usersRef.document(loggedEmail).collection("challenges_received").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { 
    @Override 
    public void onSuccess(QuerySnapshot documentSnapshots) { 
     boolean isFromCache=documentSnapshots.getMetadata().isFromCache(); 
     if (!documentSnapshots.isEmpty()) { 
     } 
    } 
}); 

はこれです: - (それは空ではないことがserver側にもかかわらず)

はたとえば、次のコードをデバッグ常にisFromCachetruedocumentSnapshot空であることが表示されます正常な行動ですか?

Cloud Firestoreにデータキャッシュを無効にする別の方法はありますか?


EDIT:

追加:FirebaseFirestore.setLoggingEnabled(flase);カスタムApplication Classに(代わりに上記のコードで)同じ結果を与えます。

+0

mDatabase.getReference()。keepSynced(false); FirebaseDatabase.getInstance()。setPersistenceEnabled(false); –

+0

個人的に見える私はそれがキャッシュと何か関係があるとは思わないが、その問題がある場合に備えて、オフライン永続性を有効にすることを確認する(https://firebase.google.com/docs/firestore/manage-data/enable-オフライン#configure_offline_persistence) –

+0

マイナーな編集をここでやり直すことを検討してください。質問にはすでに賞金が設定されていますので、編集して「バンプ」する必要はありません。 –

答えて

1

FireBaseデータベースの場合、これを試してください私はこれがどのように機能するかを確認するAndroidアプリケーションでいくつかのテストを実行しました。Firestoreは現在beta releaseにまだ存在しており、いつでも製品が変更される可能性があるため、今後この動作が保証されるとは限りません。

db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { 
    @Override 
    public void onComplete(@NonNull Task<DocumentSnapshot> task) { 
     DocumentSnapshot documentSnapshot = task.getResult(); 
     System.out.println("isFromCache: " + documentSnapshot.getMetadata().isFromCache()); 
    } 
}); 

コードに関しては、キャッシュからデータを取得している場合でも、サーバーに接続している場合でも同じです。

私はオンラインだと、それが出力します。

isFromCache: false 

私はオフラインだとき、それは印刷します

isFromCache: true 

ので、一瞬の検索を停止する方法はありませんサーバーに接続している間は、キャッシュからのデータの取得を強制することはできません。

代わりに私がリスナーを使用する場合:

db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() { 
    @Override 
    public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) { 
     System.out.println("listener.isFromCache: " + documentSnapshot.getMetadata().isFromCache()); 
    } 
}); 

私はオンラインだとき、私は2枚のプリントを取得:デバイスが永続的にオフラインのとき

listener.isFromCache: true 
listener.isFromCache: false 

Firestoreはchacheからデータを取得するためにdesingedされますアプリケーションが一時的にネットワーク接続を失っている間は、この動作を変更できません。

懐疑的に、このようなことをするAPIは、現在のところ存在しません。

編集:Firestoreで

FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

、AndroidとiOSのために、オフライン持続性がenabled by defaultです:あなたはこのコード行を使用する必要があるオフライン持続性を可能にするためにFirebase、とは異なり

上記のコード行を使用すると、データベースのローカル(内部)コピーを作成して、ネットワーク接続が一時的に失われてもアプリが動作するようFirebaseに指示することを意味します。

Firestoreでは、永続性を無効にするために、逆の検索を行い、PersistenceEnabledオプションをfalseに設定する必要があります。これはFirestoreにユーザデバイス上にデータベースのローカルコピーを作成しないように指示することを意味します。つまり、Firebaseサーバに接続されていない限りデータベースを照会できません。したがって、データベースのローカルコピーがなくても、分離されていれば例外がスローされます。だからこそ、OnFailureListenerを使用することをお勧めします。

+0

上記の作業をテストしましたか? –

+0

FireStoreが何か関係なくキャッシュからデータを取得するように設計されている場合(切断後)、「setPersistenceEnabled(false)」機能は何のために適していますか? –

+0

私の更新された答えではなぜ 'setPersistenceEnabled(false)'機能が良いのかを説明しました。見てください。 –

0
// Enable Firestore logging 
    FirebaseFirestore.setLoggingEnabled(flase); 
// Firestore 
    mFirestore = FirebaseFirestore.getInstance(); 

一般的に、Firebaseクライアントはデータのダウンロード回数を最小限に抑えようとします。しかし、それはまたそれが使用するメモリ/ディスクスペースの量を最小限にしようとします。

正確な動作は、別のリスナーがその場所でアクティブなままであるかどうか、およびディスクの永続性を使用しているかどうかなど、多くのことに依存します。同じ(または重複する)データに対して2つのリスナーがある場合、更新は1回のみダウンロードされます。しかし、ある場所の最後のリスナーを削除すると、その場所のデータが(メモリおよび/またはディスク)キャッシュから削除されます。

コードの完全な作品を見ることなく、それはあなたのケースで何が起こるかを伝えるのは難しいです。また

:あなたはFirebaseのロギング[Firebase setLoggingEnabled:YES]を有効にすることで、自分自身のためにチェックすることができます。

mDatabase.getReference().keepSynced(false);  
     FirebaseDatabase.getInstance().setPersistenceEnabled(false); 
+0

答えをありがとう。 'setPersistenceEnabled(false)'の代わりに 'FirebaseFirestore.setLoggingEnabled(false)'を置くと、結果は同じままです。オフラインになってオンラインに戻った後にサーバにリクエストを行うことはできません... あなたが「これを試してください」の下に書いたことは、「Firestore」ではなく「リアルタイムデータベース」のためだと思います。 –

+0

もう一度レビューします –

関連する問題