【问题标题】:Using Firebase (iOS-Swift) for user's Read/Write data storage使用 Firebase (iOS-Swift) 进行用户的读/写数据存储
【发布时间】:2016-05-18 12:16:48
【问题描述】:

现在 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

在用户/“uid”中,我有一个按 childByAutoId 排序的锻炼列表,其中包含单个锻炼的 ID。

我想要做的是获取所有用户锻炼的列表,然后从锻炼部分检索完整的锻炼列表。

我知道用户锻炼根目录/“uid”/workouts 的直接路径,但我如何检索整个列表并获取每个“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)
            }
        })
    }
}

既然我确切地知道所有用户锻炼/锻炼/“ID”的路径,我如何才能一次轮询所有用户,而不是为所有不同路径设置单次观察者?或者这是唯一的选择吗?

【问题讨论】:

  • 请尝试将您的结构和代码都粘贴为文本,这样我们就不必重新输入了。
  • 希望这样会更好

标签: swift parse-platform firebase ios9 mbaas


【解决方案1】:

一个超级快速的解决方案:将用户的uid添加到锻炼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

第二种选择:

如果您知道用户锻炼的路径

/users/uid_id/workouts

您可以按值观察节点,这会将该节点中的所有子节点读入快照。然后遍历快照以获取特定数据。我个人会将快照中的每个项目加载到字典数组中,甚至可能是锻炼对象。

【讨论】:

  • 实际上,我的锻炼的“所有者”属性确实是用户的ID。我没有尝试按照您所说的去做,只是因为我认为这是因为我的安全规则说只有“拥有”该锻炼的用户才能读/写该锻炼。意思是,如果我对所有锻炼进行查询,则查询将无法尝试读取所有者不是当前经过身份验证的用户的锻炼。我只读过这个,所以我会尝试看看自己。谢谢。
  • 我在答案中添加了更多内容作为替代方案。
  • 感谢您的提示。我已经测试了一些东西,并且更进一步。我已经更新了我原来的问题。
  • 我想你要问的是:现在所有的锻炼 ID 都在数组中,如何从锻炼节点加载这些锻炼。在这种情况下,也许改变你的结构会更有意义。在您的示例结构中,实际上没有任何理由拥有单独的 /workouts 节点。该数据可以很容易地存储在 /users/user_id/workouts 节点中,然后您将拥有您添加的代码所需的一切。 *请注意,我非常喜欢扁平结构更好,但在这种情况下可能没有必要。 /workouts 节点是分开的有什么原因吗?
  • 当然!这可以通过复制您要共享的数据,或将私有数据存储在 /users/user_id/workouts 中并将共享数据存储在 /workouts/shared_data 节点或许多其他解决方案中来解决。似乎你有一个答案和一个努力的方向。如果有帮助不要忘记接受答案!
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多