在火堆中存储"长"类型

vjy*_*vjy 3 javascript ios firebase

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

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

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

Mic*_*uer 7

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

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

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

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

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