[Firestore] Firestoreクエリ中にデータが時々空の場合
結論
Firestoreを使用してウェブ開発を行う場合、データへのオフラインアクセス機能がデフォルトでOFFになっているため、以下のようにDBを使用する前にこれを有効にして使用する必要があります。
await db.enablePersistence(const PersistenceSettings(synchronizeTabs: true));
または、常にオンラインデータにのみアクセスする方法もあるかもしれません。
スナップショットの結果 - メタデータ - isFromCacheを確認して、キャッシュからの結果であれば、再びオンラインデータを受信するようにすることができます。
(これは私が解決した方法ではないので、確認していませんが、こちらをご覧いただければお役に立つかもしれません。)
注意: 次の内容は、この問題を解決する過程で若干の乱れがある場合があります。
宇宙人の計算機共有のためのウェブサービスを開発している際に、firebaseのFirestoreに保存された情報を取得して表示する必要がありました。
Androidアプリを開発する場合と同じようにコードを記述し、テストしてみるとうまくいくようでした。
そのため、デプロイも完了しましたが、翌日にアプリと連携する部分をテストしてみると、時々データが存在しないという画面が表示される状況が発生しました。
いつものように、Stack Overflowで調べてみると、私の状況に合致するものはあまり出てこなかったのです。
私の場合、ほとんどの場合、クエリの結果をうまく表示していましたが、時々データを取得できない場合がありました。
続けて検索していくと目についたのがまさにキャッシュに関する問題でした。
ウェブアプリをデバッグモードで実行しながら、いつ空のデータが入っているかを確認してみると、やはりキャッシュから読み取る場合(snapshot - metadata - isFromCacheを確認)に空のデータが入っていました。
(ここでなぜエラーを出さずに、空のデータとして処理するのかがよく理解できませんが、おそらくキャッシュにデータがない場合、データ自体が存在しないと判断して独自にエラー処理しないようです。)
(それでも、DB設定でオフラインでデータにアクセスする機能がオフになっている場合、キャッシュにアクセスしようとしたときにエラーが表示された場合、それは簡単に解決されませんでしたか?)
(とにかく、firebaseの機能要求に関連内容を投稿しました。この内容が反映されることを望む場合は、一度読んで投票してくださいね~)
また、firebaseのドキュメントを見ると、ウェブの場合、オフライン持続性を使用しないようにすることがデフォルト設定になっていることがわかりました。
そこで、firebaseドキュメントに従ってDBを初期化する際に以下の内容を追加しました。
await db.enablePersistence(const PersistenceSettings(synchronizeTabs: true));
その後、テストしたところ、キャッシュから取得する場合でもうまく動作し
ました。
未解決の問題
ウェブに対してオフライン持続性を使用しないことがデフォルトになっている理由があるかもしれませんが、おそらく、すべてのブラウザでオフライン持続性をサポートしていないためだと思われます。
この点について理解できるようになったら、この記事に追加の記録を残します。
あなただけの計算機を作成して使用したい場合は、Google Playから数宇をダウンロードしてみてください。