0

Parse が閉鎖されたので、Firebase をメインの BaaS として使い始めたいと考えています。現時点では、Firebase のリアルタイム機能は興味深いものであり、将来的にはそれらを使用する予定ですが、現時点では主に、ユーザーと関連データを保存する方法として Firebase を使用したいと考えています。Parse を使用すると、関連付けられたユーザーをオブジェクトに関連付けてオブジェクトをアップロードするだけで済み、これは非常に簡単でした。次に、そのユーザーに関連付けられたオブジェクトでフィルター処理できます。

ただし、Firebase ではすべてがオンデマンドではなくイベント ドリブンであり、セキュリティ ルールでフィルタリングすることはできません。一般的に、私はこのアプローチが好きですが、今日必要なものに適用するのに苦労しています. 私はネットワーキング/データベースのバックグラウンドをあまり持っていないので、これらのいくつかは本当に基本的なものである可能性があります.

これが私がやろうとしていることです:

現在、Firebase のデータ構造は次のようになっています。

xnterval
   users
      100b920f-d2c5-4578-9f49-ecf38ef71302
      32a8dbf2-009a-44c5-a188-ca2c280ba135
      d53b0b37-d773-4cf5-af94-74635fc76f1f
         name: "Joe Schmo"
         provider: "password"
         username: "jschmo"
         workouts
            -K9wZ4_Rt-xBdVZt93d4
                workout_id: "-K9wZ4_Rt-xBdVZt93d3"
   workouts
      -K9wZ4_Rt-xBdVZt93d3
            interval_period: 180
            intervals: 2
            name: "Workout"
            owner: "d53b0b37-d773-4cf5-af94-74635fc76f1f"
            rest_period: 150
            work_period: 30

ここに画像の説明を入力

User/"uid" 内には、childByAutoId で並べられたワークアウト リストがあり、単一のワークアウトの ID が含まれています。

私ができるようにしたいのは、すべてのユーザーのワークアウトのリストを取得し、ワークアウト セクションからその完全なワークアウト リストを取得することです。

ユーザーのワークアウト root/"uid"/workouts への直接の PATH はわかっていますが、リスト全体を取得して各 "workout_id" を取得し、続いて /workouts セクションでワークアウトのリストを照会するにはどうすればよいでしょうか?

また、他のユーザーが別のユーザーのデータにアクセスできないように、セキュリティ ルールを既に設定してあります。また、ワークアウトの所有者が認証されたユーザーの UID である場合にのみ、ワークアウトの読み取り/書き込みを行うことができます。これは正しく機能しています。

たぶん、私はこれを間違った方法で行っているか、データを構造化して目的を達成するためのより簡単な方法があります。クエリで必要な転送量を最適化するためにデータの非正規化に関する記事をいくつか読みましたが、将来に向けて構築するには、このデータ構造が理想的だと思います。でも、もっと経験があれば教えてください。ありがとう!

アップデート

そこで、すべてのユーザーのワークアウト ID を取得し、それらを配列 userWorkoutIds に格納するこのメソッドを作成しました。

private func observeAllUserWorkouts() {
    if userAuthData != nil {
        workoutObserver = userRef?.childByAppendingPath("workouts").observeEventType(FEventType.Value, withBlock: { snapshot in
            let enumerator = snapshot.children
            while let child = enumerator.nextObject() as? FDataSnapshot {
                NSLog("\(child.childSnapshotForPath("workout_id").value)")
                self.userWorkoutIds?.append(child.childSnapshotForPath("workout_id").value as! String)
            }
        })
    }
}

すべてのユーザー ワークアウト /workouts/"ID" のパスが正確にわかったので、すべてのパスに対してシングル ショット オブザーバーを設定するのではなく、一度にすべてをポーリングするにはどうすればよいでしょうか? またはそれが唯一のオプションですか?

4

1 に答える 1

1

非常に簡単な解決策: ユーザーの uid を training_id ノードに追加します。

次に、取得したいワークアウトのユーザーに等しい uid のワークアウト ノードを照会できます。

workouts
   workout_id_0
     interval_period: 180
     internvals: 2
     uid: user_id
   workout_id_1
     interval_period: 180
     internvals: 2
     uid: user_id

2 番目のオプション:

ユーザーのワークアウトへのパスを知っている場合

/users/uid_id/ワークアウト

ノードを値で観察すると、そのノードのすべての子がスナップショットに読み込まれます。次に、スナップショットを反復処理して特定のデータを取得します。個人的には、スナップショット内の各アイテムを辞書の配列またはワークアウト オブジェクトにロードします。

于 2016-02-08T19:17:44.417 に答える