我希望在我的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": { ... }
}
}
答案 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] }