我使用以下方法在 firebase 中上传数据:
HashMap<String, Object> m = new HashMap<String, Object>();
if(approved.isChecked()){
m.put("qDepartmentHeadApproval",approved.getText().toString());}
else{
m.put("rDepartmentHeadApproval",rejected.getText().toString());}
我想使用这个从 Firebase 检索此数据
Map<String, Object> map=(Map<String, Object>) dataSnapshot.getValue();
但是我能怎样呢?
我希望数据将以单个文本视图形式从 Firebase 中选定的复选框中检索。
由于您小时候将
Map
推向 firebase,那么当您使用 dataSnapshot.getValue();
时
您将获得一张地图,具体取决于它是否是正确的子键。
我知道你已经知道这一点,但你知道如何阅读地图不是吗?
Map<String, Object> data = (Map<String, Object>) dataSnapshot.getValue();
if (data.containsKey("qDepartmentHeadApproval")) {
String s = (Strting) data.get("qDepartmentHeadApproval");
}
s
是您的数据。
您正在使用您使用的密钥查找数据,在本例中为 qDepartmentHeadApproval
。
返回的值将是一个字符串,因为您推送了一个字符串。
映射是键到值,
map.get("key")
返回该键的值。
存在大量转换,您最终可能会在将来遇到错误,而无需实际正确检查值。
Firebase 返回的地图在 Java 中始终是
Map<String, Object>
,但它并不总是地图。
你可以尝试这样的事情:
//suppress the unchecked cast warning
@SuppressWarnings("unchecked")
public void loadData() {
Object value = dataSnapshot.getValue();
//check if the value is a map.
if (value instanceof Map<?, ?>) {
//cast the value to a map
Map<String, Object> data = (Map<String, Object>) value;
//check if the map contains the key and the value is a string
if (data.containsKey("key") && data.get("key") instanceof String) {
String s = (String) data.get("key");
}
}
}
这基于Java 8。我知道可以使用更高的java来减少它。 您还可以对
getValue()
使用 GenericTypeIndicator,但它的作用并不大。它只是为了处理java中的类型擦除并删除警告的使用。
您也可以删除
containsKey
部分。我只是为了安心而保留它。
无论如何..您应该在投射之前检查这些值。我知道这是非常重复的,但您将来会避免很多潜在的问题。相信我。