質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

6316閲覧

firestoreの差分データ取得

1901drama

総合スコア20

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/10/10 13:06

編集2018/10/10 16:34

Firestoreで差分(更新された)データのみを取得したい

firebaseのfirestoreをDBとしたSNSアプリを作っています。
タイムライン機能の実装にあたり、現在取得しているデータ以後に追加されたデータのみ取得し、タイムテーブルに反映させたいと考えています。
しかしながら、データの差分を判断し、追加されたデータのみを取得するという方法がわからず、全てのデータを取得してしまいます。
ローカルまたはキャッシュに保存しているデータとの差分データのみを取得するにはどのようにすれば良いのでしょうか。

もしお分かりになる方がいらっしゃれば、宜しくお願い致します。

発生している問題

エラーコードは特になし(何回目の実行でも対象データが全て取得される)

swift

1self.defaultStore.collection("OBJECT").order(by: "CREATE_TIME", descending: false).limit(to: 20).addSnapshotListener{ (querySnapshot, err) in 2 guard let snapshot = querySnapshot 3 else{ print("Error fetching snapshots: (error!)");return} 4 snapshot.documentChanges.forEach{ diff in 5 if (diff.type == .added){ 6 print("added: (diff.document.data())") 7 let DOCUMENT_DATA = diff.document.data() 8 guard let CREATE_TIME = DOCUMENT_DATA["CREATE_TIME"] as? Int else { return } 9 self.POST_TIME_LIST.insert(CREATE_TIME, at: 0) 10 } 11 if (diff.type == .modified){ 12 print("modified: (diff.document.data())") 13 } 14 } 15 self.POST_TABLE_VIEW.reloadData() 16}
swift4.0

試したこと

以下を参考にさせて頂き幾つか試したところ上記の結果になりました。 https://qiita.com/miyae/items/6988c1b61b76b4938ae6#単一ドキュメントへ設定 https://qiita.com/SatoTakumi/items/c542b1c0fc0694d4b60d#変更がある場合のみ取得--リアルタイムに取得

補足情報(FW/ツールのバージョンなど)

/xcode10.0/ iOS12.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

「差分データのみを取得する」という記法は、Firestoreにはなかったと思います。
スナップショットリスナーは、クエリ条件に合致するデータを(変更があるごとに)すべて取得するObservableです。
なので、記載されているコードのように、diff.typeを見て document ごとに差分があるかないかチェックして処理するという流れになります。

「差分データのみ取得したい」というのは、read数を節約するためでしょうか。
であれば、t_obaraさんの言及されている通り、whereを利用してクエリ条件を絞るしかありません。
例えば以下の方法ではどうでしょう(実装は大変ですが)

1)add, update, delete時にタイムスタンプフィールドに serverTimestamp()を設定する
2)スナップショットリスナーで、タイムスタンプフィールドをチェック、最も未来日のタイムスタンプをローカルに保持する
3) 2)のリスナーをデタッチ。2)で取得した最未来時刻「より大きい」をwhereクエリに設定し、新しいスナップショットリスナーを生成
4) 以下、2)3)を繰り返す

投稿2018/10/13 03:55

gekijin

総合スコア187

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1901drama

2018/10/16 08:52

回答ありがとうございます! やはり「差分データのみを取得する」という記法は、Firestoreにはないのですね... 記載された内容に近い内容で以下のように実装しました。 ①対象データを時間順でソートして取得 ②最新値のデータが持っていた時間を、セーブデータとして保持 データ更新時には ③startAfter(セーブデータ)で、最新値以降のデータを取得 ④セーブデータを更新 セーブデータを管理するのがやや億劫になっていますが、一先ずしたいことは出来ました^^
guest

0

本家のサンプル:Cloud Firestore で単純なクエリと複合クエリを実行する
こちらによると、whereFieldを使用して所望の条件を指定するのではないでしょうか。

投稿2018/10/11 01:01

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問