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