java - 为什么我们在向firestore发送数据时,将HashMap中的参数设置为object?

标签 java android firebase google-cloud-firestore hashmap

我正在观看一个视频来创建一个简单的应用程序(只是为了练习概念),用户可以在其中输入标题和他们的想法。此数据将发送到 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<String, Object>而不是 Map<String, String> .标题和想法不就是用户输入的字符串值吗?

编辑:

此外,当我转到 Firestore 时,为什么它会将想法和标题显示为字符串而不是对象(在 HashMap 中声明)?

Hovers over data, shows string

谢谢!

最佳答案

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

Why do we pass data as Map<String, Object> instead of Map<String, String>?

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

Isn't the title and thoughts just the user's input as a String value?

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

并回答您编辑过的问题:

Also, when I go to Firestore, why does it show the thoughts and title as a String rather than an Object(which was declared in the HashMap)?

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

关于java - 为什么我们在向firestore发送数据时,将HashMap中的参数设置为object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67406280/

相关文章:

java - IKVMC,单声道 : ClassCastException while deserialization

swift - 通过电子邮件发送密码重置代码 - Swift + Firebase

android - MediaPlayer 直播 m3u8 音频错误 (1,-1010)

firebase - 获得当前用户时未设置我的变量

android - 带命名空间的 Firebase 远程配置

java - Selenium WebDriver 中使用 XPath 从子节点遍历到祖先节点

java - 与 <?>,<? 混淆扩展对象>,<? java泛型中的 super 对象>

java - robolectric 单元测试 android Timer

android - 未找到相应的方法处理程序 - Android XML

java - Android Java - 如何从 URL 下载 zip 文件?