【问题标题】:Firebase setValue with Map with different typesFirebase setValue 与不同类型的 Map
【发布时间】:2016-09-11 00:34:19
【问题描述】:

为了更新 Firebase 中的对象,我使用了这段代码,它将我的模型转换为字典。

这是做这种事情的方法:

private static Map<String, Object> getPlayerData(Player player) {
    Map<String, Object> data = new HashMap<>();
    data.put(PLAYER_ID_KEY, player.getId());
    data.put(PLAYER_NAME_KEY, player.getFullName());
    data.put(PLAYER_SCORE_KEY, player.getScore());
    data.put(PLAYER_STATUS_KEY, player.getStatus());
    return data;
}

这就是我使用结果的方式,将其设置为theFirebaseRef 的值:

Map<String, Object> playerData = getPlayerData(userAsPlayer, newPlayerStatus);

theFirebaseRef.setValue(playerData, new Firebase.CompletionListener() {/**irrelevant code**/});

它有效,但 PLAYER_SCORE_KEY 在 Firebase 中最终成为 string,而它应该是 int:

我想这是有道理的,因为我正在做一个 Map 并声明它的值是 Object 类型。

从Map&lt;String, Object&gt; 设置值时,有没有办法让PLAYER_SCORE_KEY 成为int?

编辑:

getter getScore() 返回一个int:

public int getScore() {
     return score;
}

编辑:

为了澄清,分数仅在从我的应用程序调用时存储为字符串。当 web/iOS 客户端添加/修改播放器时,它们会将其保存为 int。 问题是 Android 是唯一不这样做的!

(将我的模型设置为 Firebase 文档中所做的值不是一种选择,因为 Firebase 属性名称很难看,而且服务器人员对所有内容都使用不同的名称...)

【问题讨论】:

  • 很难确定,但很可能player.getScore() 返回一个字符串。如果您让它返回一个数字(例如Integer),Firebase 将存储该数字。
  • 嗨@FrankvanPuffelen,player.getScore() 实际上返回一个int!
  • 但是数据库存储的是一个字符串(你可以通过数字周围的引号来判断)。字符串到整数的转换不会自动发生,您要么必须将其存储为数字,要么在代码中处理。
  • @FrankvanPuffelen 我不认为我在关注你。它清楚地将其存储为字符串,仅在从我的应用程序调用时,因为我保存错误。 getScore() 返回一个整数。刚刚尝试用 Integer.valueOf() 包装它(没有意义但必须尝试),它仍然将其保存为字符串。 (从 Web/iOS 客户端调用时,BTW 分数保存为 int)。

标签: java android dictionary firebase


【解决方案1】:

我相信你的问题是你的地图参数。您可能需要制作两张地图,一张像您一样带有参数(字符串,对象),另一张类型为(整数,对象)来保存任何整数信息。然后相应地设置 Firebase 中的值。

否则,您可以在 PLAYER_SCORE_KEY 上使用 Integer.parseInt() 将其转换为整数,然后直接在 Firebase 中设置此值,而不是在地图中传递它。

【讨论】:

  • 要做到这一点,我需要制作 firebaseRef.setValue 两次,对吧?这不是提出两个要求吗?
猜你喜欢
  • 2013-07-15
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多