Java Firebase:检索实现映射的类的值<;K、 V>;
假设我有数据类:Java Firebase:检索实现映射的类的值<;K、 V>;,java,android,firebase,firebase-realtime-database,hashmap,Java,Android,Firebase,Firebase Realtime Database,Hashmap,假设我有数据类: class MyDataClass { ... public Map<String, Object> properties = HashMap() } // later MyDataClass data = snapshot.getValue(MyDataClass.class); 运行此代码后,data.properties没有数据 我想知道是否有可能将数据检索到自定义映射实现 UPD:JSON我试图阅读 { items: { "i
class MyDataClass {
...
public Map<String, Object> properties = HashMap()
}
// later
MyDataClass data = snapshot.getValue(MyDataClass.class);
运行此代码后,data.properties没有数据
我想知道是否有可能将数据检索到自定义映射实现
UPD:JSON我试图阅读
{
items: {
"id": {
"name": "name",
"properties": {
"simpleProp1": "value1",
"simpleProp2": "value2",
"simpleProp3": "value3",
"complexProp1": {
"subPop1": "subVal1"
...
}
}
}
}
}
谢谢 我认为Firebase无法直接使用您的自定义
Map
实现。因此,您可以考虑添加一个简单的数据类来代替:
class MyDataJSON {
public MyDataJSON() { }
public String name;
public Map<String, Object> properties;
}
class MyDataClass {
MyDataClass(MyDataJSON json) { ... }
...
}
我知道这远非完美,但至少您可以完全控制数据库解组过程(以及相应的属性类型) 这段代码似乎对我有用:
public static class MyDataClass {
public String name;
public Map<String,Object> properties = new HashMap<String,Object>();
@Override
public String toString() {
return "MyDataClass{" +
"name='" + name + '\'' +
", properties=" + properties +
'}';
}
}
印刷品:
MyDataClass{name='name',properties={simpleProp2=value2,simpleProp1=value1,CompleProp1={SubProp1=subVal1},simpleProp3=value3}
为什么要使用MyMap类?您可以直接添加MyDataClass,如下所示
公共类MyDataClass{public HashMap myData;public HashMap getMyData(){return myData;}public void setMyData(HashMap myData){this.myData=myData;}}}
似乎您误解了我的问题。我需要为“属性”使用自定义映射实现。我想知道为什么firebase snapshot.getValue()方法不使用数据填充它?你有没有收到任何错误?@AlexMamo没有错误。在我看来,firebase根本不“理解”MyMap是一个自定义的映射实现,并搜索用于填充数据的属性。由于MyMap firebase中没有属性,请跳过它。为什么需要自定义实现?也许我们会找到另一种方法。我想他想用他的自定义Map
实现来代替properties
字段(即他的MyMap
类)。谢谢你,弗兰克!这个代码也适用于我。但是我想要的是替换新的HashMap();用我自己实现的映射接口。出于测试目的,您可以创建实现Map接口的类,只需将其所有方法调用委托给私有HashMap属性即可。抱歉,延迟了。这需要深入研究。自定义映射类将不起作用。在这种情况下,我们的反序列化没有意识到它是一个集合,因此将其视为一个bean类(序列化各个属性/字段),而不是集合中的项。@abond Nice;)顺便说一句,别忘了投票/接受我的答案,这样我们就可以把这个问题标记为结束。谢谢你,伙计!
MyDataJSON json = snapshot.getValue(MyDataJSON.class);
MyDataClass data = MyDataClass(json);
public static class MyDataClass {
public String name;
public Map<String,Object> properties = new HashMap<String,Object>();
@Override
public String toString() {
return "MyDataClass{" +
"name='" + name + '\'' +
", properties=" + properties +
'}';
}
}
ref.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
MyDataClass data = dataSnapshot.getValue(MyDataClass.class);
System.out.println(data);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});