【问题标题】:Why do we set the parameter in HashMap to object when sending data to firestore?为什么我们在向firestore发送数据时将HashMap中的参数设置为object?
【发布时间】:2021-07-28 01:40:36
【问题描述】:

我正在观看一个视频来创建一个简单的应用程序(只是为了练习概念),用户可以在其中输入标题和他们的想法。此数据将被发送到 Firestore。

但是,我对通过 HashMap 发送数据的部分感到困惑:

Map<String, Object> data = new HashMap<>();
data.put(STRING_TITLE, title);
data.put(STRING_THOUGHTS, thoughts);

标题和思想基本上只是用户输入标题和思想的字符串值。

String thoughts = edtThoughts.getText().toString().trim();
String title = edtTitle.getText().toString().trim();

之后,我所做的只是将它传递给 journalRef:journalRef.set(data),其中 journalRef 只是我的数据库的 DocumentReference:

private FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference journalRef = db.collection("Journal").document("MyThoughts");

我的问题是:为什么我们将数据传递为Map&lt;String, Object&gt; 而不是Map&lt;String, String&gt;。标题和想法不只是用户输入的字符串值吗?

编辑:

另外,当我去 Firestore 的时候,为什么它把想法和标题显示为一个字符串而不是一个对象(在 HashMap 中声明)?

谢谢!

【问题讨论】:

  • getText() 已经返回 String。您无需在String 上致电toString()
  • 你可以将它设置为任何你喜欢的为你编译的东西。 set(data) 的实际参数是Object。一旦它进入该方法,你的泛化就会丢失。
  • 哦,我明白了。谢谢!

标签: java android firebase google-cloud-firestore hashmap


【解决方案1】:

您可以将上面的示例声明为Map&lt;String, String&gt;,因为您在其中放入了简单的数据。但更高级的示例可能会让您将更深层次的结构化对象放入 Firestore,因此使用Map&lt;String, Object&gt; 更合适。 Firestore 是一个“文档存储数据库”,其中文档是一个 HashMap。该哈希中的元素是名称/值对,其中名称是字符串,值可以是:字符串、布尔值、数字、时间戳、数组、(哈希)映射、地理位置。

因此,将data 声明为HashMap&lt;String, Object&gt; 更正确,因为可以进入其中。

【讨论】:

  • 谢谢!请查看我对问题所做的修改。
  • 当我将鼠标悬停在数据上时,它显示为字符串。知道为什么会这样吗?谢谢。
【解决方案2】:

在 Firestore 文档中,字段名称总是精确的字符串,而值是对象。是否要添加字符串、布尔值、数字或任何类型的 supported data type 对象并不重要,都可以被视为对象。 Java 中的第一条规则是一切都是对象。因此,无论您向数据库添加什么,Firestore 都会始终根据其数据类型保存数据。回答你的问题:

为什么我们将数据作为 Map 而不是 Map 传递?

你需要根据你需要执行的操作来传递数据。如果您想使用set() 方法向数据库添加数据,那么您可以使用Map&lt;String, String&gt;,这是因为该方法需要一个Object 类型的参数。但是,如果您想使用 update() 方法执行更新操作,请注意您不能使用 Map,因为该方法需要 Map&lt;String, Object&gt;。除此之外,当您想要执行更新时,您可以将不同类型的对象作为值传递,并相应地更新字段。所以你可以随时update multiple fields at once

标题和想法不只是用户输入的字符串值吗?

是的,是的。如果只想使用set()添加标题和想法,那么可以使用Map,否则,对于更新操作,需要使用Map

并回答您编辑的问题:

另外,当我去 Firestore 的时候,为什么它把想法和标题显示为一个字符串而不是一个对象(在 HashMap 中声明)?

它将始终根据您添加的值显示值。在 Firebase 控制台中,除了地图的对象之外,没有其他对象表示。除此之外,在幕后,您添加的每个对象都有一个instanceof 验证。因此,如果您传递一个字符串,则该对象将始终保存为字符串,而不是以任何其他方式。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2011-10-30
  • 2014-11-23
相关资源
最近更新 更多