在Firebase中存储切换按钮状态

时间:2020-11-05 11:41:26

标签: ios firebase google-cloud-firestore swiftui

我希望在我的SwiftUI应用中有〜100个切换按钮,并带有与之关联的硬编码项(所有用户将具有相同的项目)-切换表示用户是否具有该项目。我将Firebase用于后端,并已实现身份验证和数据库(实时,但我想我将更改为Firestore)。

对于每个使用该应用程序的用户,我如何最佳地存储这些按钮是否处于选中状态?

一种解决方案是将所有100个项目存储在数据库中的用户ID下,但这会导致大量重复数据。 (1000个用户将意味着只为100个不同的项目存储100,000个项目状态)。 (对于可伸缩性不是很好)

例如:

{
  "users": {
    "1": {
      "name": "Donald Biden",
      "items" : {
      "House" : "False",
      "Car" : "True",
       .
       .
      },
    },
    "2": {
      "name": "Joe Trump",
      "items" : {
      "House" : "True",
      "Car" : "True",
    },
    "3": { ... }
  }
}

2 个答案:

答案 0 :(得分:1)

您的解决方案也是我想到的第一种方法。

进行改进:由于切换按钮只有两种状态,因此您只能存储所有真值或所有假值,无论您认为会导致更少的输入。

仅存储true的示例:在您的应用中,您可以检查用户特定按钮的值是否为true,否则将其设置为false。

编辑:为了更加清楚,您不会在我的示例中存储import xml.etree.ElementTree as ET xmlfile = 'aniaml.xml' try: with open(xmlfile, 'r') as xmldata: xmltree = ET.fromstring(xmldata.read()) # add all your actions with 'xmldata' inside this loop except IOError: print('Could not open the file:'.format(xmlfile)) 。因为没有House值,所以您只需将按钮设置为false。

答案 1 :(得分:1)

这实际上取决于您如何构造数据库。但是,如果以这种方式进行结构化,则可以帮助您减少数据存储量:

一个匹配表,返回所有具有唯一ID的键:

KeysTable:

1: "House",
2: "Car",
...

然后,每个用户的项目列表如下所示:

"Items": [1, 4, 5, 6, 8, ...] // List only the key ids with "true" values

最后,每个用户都可以使用键表来检索哪些键已打开和哪些键已关闭:

Pseudocode:

OnItems = user.items.map { KeysTable.getValueWithKey[$0] }
OffItems = KeysTable.keys.difference(user.items).map { KeysTable.getValueWithKey[$0] }