在火堆中存储“长”类型

时间:2015-08-10 22:47:01

标签: javascript ios firebase

我们有一个由Core Data支持的iPhone应用程序。我们在核心数据存储中使用int64,我想知道是否需要做任何特殊的事情来存储firebase中的数字。我想知道这是因为javascript不支持64位无符号整数。我们还在编写一个javascript应用程序,必须阅读此编号。

我能想到的一种方法是将其存储为字符串,然后在iPhone客户端上将其转换为int64。然而,这似乎有点乏味,firedata似乎不直接支持这样的翻译。我们还必须在Firebase中添加对此属性的验证 - 因此验证将是一个只有数字的字符串而不是数字。

是否有人遇到过这些问题以及针对此问题的推荐方法是什么?

1 个答案:

答案 0 :(得分:5)

这确实是一个棘手的情况。首先只是为了使情况清楚(我认为你知道这一点,但只是为了避免任何混淆):

  • Firebase可以/将精确存储64位整数。
  • Android和iOS客户端可以毫无问题地交互(读取和写入)64位整数。
  • JavaScript将所有数字存储为64位浮点数,这意味着它只能精确表示高达~2 ^ 52的整数。 2 ^ 52和2 ^ 64之间的整数可能会丢失精度(四舍五入到64位浮点数表示的最接近的整数)。

至于你的选择,我怀疑你对这些也有很好的处理,但你可以:

  • 容忍精确度的损失。有时候这没关系。例如,也许你可以保证你不会存储超过2 ^ 52的整数,因此精度的损失实际上不会成为问题。或者您可能只需要查看来自JS的数据,并且可以进行一些舍入。需要注意的一件事是,如果您从JS读取数据并将其写回,则数据将被写回Firebase,但精度会下降。
  • 将数字存储为字符串。如您所知,您只需将数字存储为字符串即可。但这可能不方便,并且限制了您可以在安全规则中进行的验证。
  • 将数字拆分为2个32位整数。您可以将高32位与低32位分开存储。这可能不方便,但可以让您保持精确度,并在安全规则中进行一些数字验证。

可能还有其他选择,但这些选项会立即浮现在脑海中。希望这有帮助!