【问题标题】:Storing 'long' type in firebase在firebase中存储“长”类型
【发布时间】:2015-08-10 22:47:01
【问题描述】:
我们有一个由 Core Data 支持的 iPhone 应用程序。我们在核心数据存储中使用 int64,我想知道我们是否需要做任何特别的事情来将数字存储在 firebase 中。我想知道这一点,因为 javascript 不支持 64 位无符号整数。我们还在编写一个 javascript 应用程序,它必须读取这个数字。
我能想到的一种方法是将其存储为字符串,然后在 iPhone 客户端上将其转换为 int64。然而,这似乎有点乏味,firedata 似乎并不直接支持这样的翻译。我们还必须在 Firebase 中对该属性添加验证 - 因此验证将是一个只有数字的字符串,而不是数字。
有人遇到过这些问题吗?针对此问题的推荐方法是什么?
【问题讨论】:
标签:
javascript
ios
firebase
【解决方案1】:
这确实是一个棘手的情况。首先只是为了说明情况(我认为您已经意识到这一点,但只是为了避免任何混淆):
- Firebase 可以/将精确存储 64 位整数。
- Android 和 iOS 客户端可以毫无问题地交互(读取和写入)64 位整数。
- JavaScript 将所有数字存储为 64 位浮点数,这意味着它只能精确表示高达 ~2^52 的整数。 2^52 和 2^64 之间的整数可能会丢失精度(四舍五入到可以用 64 位浮点数表示的最接近的整数)。
至于你的选择,我怀疑你也能很好地处理这些,但你可以:
-
容忍精度损失。有时这没关系。例如,也许您可以保证不会存储超过 2^52 的整数,因此精度损失实际上不会成为问题。或者也许你只需要从 JS 中查看数据,一些四舍五入就可以了。需要注意的一件事是,如果您从 JS 读取数据并将其写回,则数据将被写回 Firebase,但精度会有所下降。
-
将数字存储为字符串。 正如您所建议的,您可以将数字存储为字符串。但这可能会带来不便,并且会限制您可以在安全规则中进行的验证。
-
将数字拆分为 2 个 32 位整数。 您可以将高 32 位与低 32 位分开存储。这可能不方便,但可以让您保持精度并在安全规则中进行一些数字验证。
可能还有其他选项,但这些是立即浮现在脑海中的选项。希望这会有所帮助!