首页 > 解决方案 > 为什么我们在向firestore发送数据时将HashMap中的参数设置为object?

问题描述

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

悬停在数据上,显示字符串

谢谢!

标签: javaandroidfirebasegoogle-cloud-firestorehashmap

解决方案


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

为什么我们将数据作为 Map<String, Object> 而不是 Map<String, String> 传递?

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

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

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

并回答您编辑的问题:

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

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


推荐阅读