Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Firebase中存储切换按钮状态_Ios_Firebase_Google Cloud Firestore_Swiftui - Fatal编程技术网

Ios 在Firebase中存储切换按钮状态

Ios 在Firebase中存储切换按钮状态,ios,firebase,google-cloud-firestore,swiftui,Ios,Firebase,Google Cloud Firestore,Swiftui,我希望大约有100个切换按钮,带有与之关联的硬编码项(所有用户都将拥有相同的项)-切换表示用户在我的SwiftUI应用程序中是否拥有该项。我使用Firebase作为后端,并实现了身份验证和数据库(实时,但我想我将改为firestore) 对于使用应用程序的每个用户,我如何以最佳方式存储是否选中/取消选中了这些按钮 一个解决方案是将所有100个项目存储在数据库中的用户id下,但这会导致大量重复数据。(1000个用户意味着仅为100个不同的项目存储100000个项目状态)。(对于可伸缩性来说不是很好

我希望大约有100个切换按钮,带有与之关联的硬编码项(所有用户都将拥有相同的项)-切换表示用户在我的SwiftUI应用程序中是否拥有该项。我使用Firebase作为后端,并实现了身份验证和数据库(实时,但我想我将改为firestore)

对于使用应用程序的每个用户,我如何以最佳方式存储是否选中/取消选中了这些按钮

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

例如:


你的解决方案也是我想到的第一个方法

改进方法:由于切换按钮只有两种状态,所以只能存储所有真值或所有假值,无论您认为什么都会减少输入

例如,如果只存储true:在应用程序中,您可以检查用户的特定按钮是否有true值,否则只需将其设置为false


编辑:为了更清楚,在我的示例中,您不会存储
“House”:“False”
。因为没有房屋价值,所以您只需将按钮设置为false。

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

改进方法:由于切换按钮只有两种状态,所以只能存储所有真值或所有假值,无论您认为什么都会减少输入

例如,如果只存储true:在应用程序中,您可以检查用户的特定按钮是否有true值,否则只需将其设置为false


编辑:为了更清楚,在我的示例中,您不会存储
“House”:“False”
。因为没有内部值,所以您只需将按钮设置为false。

这实际上取决于您如何构建数据库。但是,如果采用这种结构,则可能有助于减少数据存储的使用:

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

KeysTable:

1: "House",
2: "Car",
...
然后,每个用户的项目列表可以如下所示:

"Items": [1, 4, 5, 6, 8, ...] // List only the key ids with "true" values
最后,每个用户都可以使用keys表检索哪些键处于打开状态,哪些键处于关闭状态:

Pseudocode:

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

这实际上取决于数据库的结构。但是,如果采用这种结构,则可能有助于减少数据存储的使用:

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

KeysTable:

1: "House",
2: "Car",
...
然后,每个用户的项目列表可以如下所示:

"Items": [1, 4, 5, 6, 8, ...] // List only the key ids with "true" values
最后,每个用户都可以使用keys表检索哪些键处于打开状态,哪些键处于关闭状态:

Pseudocode:

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

谢谢,我也考虑过,但是我不知道我会从哪里检索用户没有的东西。你会在应用程序中创建所有项目,然后在启动时初始化这些值吗?我想我不完全理解你所说的“检索用户没有的项目”是什么意思。如果密钥(例如“House”)不包含在数据库中,那么用户就没有这个项目。谢谢@ TsChnias,我确实也考虑过,但是对于我在哪里检索用户没有的项目感到困惑。你会在应用程序中创建所有项目,然后在启动时初始化这些值吗?我想我不完全理解你所说的“检索用户没有的项目”是什么意思。如果您的数据库中未包含密钥(例如“house”),则用户没有该项。