在火力基地中存储“长”类型

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

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

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

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

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

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

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

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