【问题标题】:How to store data, from Firebase, with multiple values for each key?如何存储来自 Firebase 的数据,每个键都有多个值?
【发布时间】:2017-10-10 13:23:27
【问题描述】:

我在 Firebase 上的结构是这样的:

picture of structure-layout

(好像我还不能嵌入图片,所以他们把它做成了链接)

由于我是 Swift 新手,所以在这里我有点困惑。 显然,这项任务很简单。

我想将数据存储在用户设备上。 这样,如果新数据更新到 Firebase,设备将在登录时检索新数据,而无需用户通过 App Store 更新应用。

我已经得出结论,可以使用一系列字典,但是如何?

我的问题是价值观.. 它们似乎是一起下载的,在一个 SNAP 中,而不是部分下载。 (比如:“SNAP1: yada yada”、SNAP2: ...“等等)

我需要能够在任何时候只访问属于我想要的任何键的一个值。

这是我的代码(我知道它还不完整,但我卡住了):

func updateData() {

    var dictArray: [[String:String]] = []


    // Setting the refference and getting the values within a snapshot..
    ref.child(REF_CATEGORIES).observeSingleEvent(of: .value, with: { (snapshot) in

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {

                let categories = snap.key
                let questions = snap.children.allObjects
                dictArray.append([categories : String(describing: questions)])

                }
        }
    })
}

不知何故,我也需要遍历这些值,但是:如何将它们(索引)与正确的类别合并?

我感觉它就在我的鼻子下面。可惜我的鼻子太大了,我看不到 :)

提前致谢!

【问题讨论】:

  • 我想帮助你,但我需要更多信息。您可以编辑您的问题以包含数据库的数据结构吗?另外,您能否在字典数组中具体添加您想要的数据?
  • 首先,您的描述有点违背 Firebase 的目的。 Firebase 是一个实时的交互式数据库;当 Firebase 中的数据发生更改时,客户端应用程序会立即知道这些更改 - 因此您不需要在本地存储数据(它确实具有持久性,但这是另一个主题)。使用 .value 读取数据会读取节点中的所有数据 - 将返回多个子节点。使用 .childAdded 一次迭代一个。从快照中获得字典后,可以通过键:值对访问各个子项。 name = dict["name"] as!以字符串为例。
  • 您好 Jen,感谢您的帮助 :) 也许我误解了您,但我已经附上了结构的图像 - 它在链接中,因为我还不允许嵌入图像在这里的帖子中,由于我的菜鸟性:)
  • 杰伊。我明白你在说什么。我想你是对的。我需要的是带有一个或多个“问题”的不同“类别”。用户回答的每个问题都必须从问题“池”中撤出,因为我需要它们是随机的而不是重复的。所以你告诉我的是,我的 Firebase 以这样一种方式构建,即有回答和未回答的问题,然后应用程序一起处理这些问题,以呈现我需要的方式。谢谢。我会看看这个。
  • 是的。另外,请不要在问题中发布图像。仅以文本形式发布代码和 Firebase 结构。这样,它们是可搜索的、可编辑的,如果我们需要用结构回答问题,我们不必重新输入它。此外,链接会中断,这会影响问题的未来查看者。您可以从 Firebase 控制台获取您的 Firebase 结构 -> 右侧三点 -> 导出 JSON。

标签: swift dictionary firebase firebase-realtime-database


【解决方案1】:

由于 Firebase 数据库是基于键值的,因此您可以通过为每个值提供一个简单的数字键来大致实现您想要的。例如:

"Key1": {
   "0":"value1",
   "1":"value2",
   "2":"value3"
}

然后,您可以在检索数据时轻松地将其解析为数组。

有趣的事实:如果您以这种方式“编号”(它们实际上不是数字,它们是字符串)您的键,Firebase 数据库将 actually store this as an array under-the-hood,它们总是显示它以键值形式发送给我们。

【讨论】:

  • 这是不正确的。 Firebase 将其数据存储为 JSON,而不是数组(即使在引擎盖下)。此外,如果您依赖排序,那么使用这样的键会给您带来麻烦,因为假设您需要“插入”一个介于 1 和 2 之间的值?使用 1.5 将不起作用。最好利用子节点来处理排序,例如索引或日期。
  • @Jay 你说得对,它不是存储列表的最优雅方式,但这是 OP 所要求的。另见this album
  • 基于 cmets,我认为该答案行不通。我可能是错的。但是,您帖子中的链接显示 Firebase 数据在后台存储为数组。它显示了一个实际的 Firebase 数组作为一个值,并且该值在引擎盖下存储为 JSON。这是一个重要的概念,因为 Firebase 中的数组存储为单个值,无法编辑或添加,也无法删除单个元素。通常应避免使用Arrays Are Evil
  • @Jay 是的,你是对的,我认为他们在导出时将其呈现为数组只是一件方便的事情!
猜你喜欢
  • 1970-01-01
  • 2020-03-02
  • 2017-01-25
  • 1970-01-01
  • 2014-05-21
  • 2021-12-24
  • 2013-02-28
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多