【问题标题】:String being converted to map when setting data on firestore在 Firestore 上设置数据时将字符串转换为映射
【发布时间】:2020-08-18 23:06:53
【问题描述】:

我正在尝试保存带有一些特殊字符的字符串,当我尝试这样做时,我的 Firestore 将其保存为地图。这就是我的意思:

Future<Null> setSeen(bool seen, bool existent) async {
  print(episode['title']);
  //Output: Episódio 5.5 
  Map<String, dynamic> episodeData = {episode['title'].toString(): seen};
  if (existent) {
    await Firestore.instance
        .collection('users')
        .document(uid)
        .collection('seen')
        .document(title)
        .updateData(episodeData);
  } else {
    await Firestore.instance
        .collection('users')
        .document(uid)
        .collection('seen')
        .document(title)
        .setData(episodeData);
  }
}

上面的代码像这样保存我的数据:

这就是我想要保存的方式:

【问题讨论】:

  • 字段名称中的. 被解释为访问嵌套字段的请求。您可以通过将字符串包装在FieldPath 对象中来防止这种情况,如下所示:stackoverflow.com/a/53856542,但我没有立即在FlutterFire 中看到如何做到这一点。
  • 尝试把'\'放在点之前

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

很遗憾,无法直接将带有某些特殊字符的数据添加到 Firestore。例如,. 运算符在您的情况下会产生一个单独的嵌套对象,而不是常规字符串。一种可能的解决方案是使用FieldPath 提供密钥,但不幸的是,由于您的问题被标记为Flutter,因此firestore 插件中没有直接支持它。

另一种可能的解决方案是将特殊字符替换为其他允许的字符。 例如,在您的情况下,您可以将它们替换为一组不同的有效字符,例如 DOT%24 或其他数字,以帮助您准确识别已替换的字符并在获取时将其解析回来。

如果有帮助的话,这里有一个link 与 RTDB 的类似线程。

【讨论】:

  • 那个链接真的很有帮助,我刚刚做了一个功能来替换 firebase 的关键字符,现在它就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2021-10-03
  • 2014-03-10
相关资源
最近更新 更多