我想知道是否可以保存包含Map属性的对象,如下所示:
public class Item {
public String id;
public String name;
public double price;
public Map<String, Adds> adds;
...
Adds是另一个声明了所有getter / setter的自定义类,与Item相同。 我可以使用setvalue直接保存添加地图,但是当我尝试setvalue()时,我不断收到以下错误。
引起:com.google.firebase.database.DatabaseException:不支持使用非字符串键的地图
DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("test").setValue(p);
这就是我正在尝试的,当然p是Item的实例。有没有办法像这样直接保存对象?或者我是否需要为地图做另一个setvalue?
以下是2个班级
public class Item {
public String id;
public String name;
public double price;
public Map<String, Adds> adds;
public Item() {
}
public Item(String name, double price) {
this.name = name;
this.price = price;
adds = new HashMap<>();
}
@Exclude
public void addAdds(Adds adds){
this.adds.put(adds.getId(), adds);
}
@Exclude
public void removeAdds(Adds adds){
this.adds.remove(adds);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
@Exclude
public void setPrice(double price) {
this.price = price;
}
public Map<String, Adds> getAdds() {
return adds;
}
public void setAdds(HashMap<String, Adds> adds) {
this.adds = adds;
}
}
这是Adds
public class Adds {
public String id;
public String name;
public double plus;
public double minus;
private boolean primary = false;
public Adds() {
}
public Adds(String name) {
}
public Adds(String id, String name, double plus, double minus) {
this.id = id;
this.name = name;
this.plus = plus;
this.minus = minus;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getPlus() {
return plus;
}
public double getMinus() {
return minus;
}
private boolean isPrimary() {
return primary;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Adds{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", plus=" + plus +
", minus=" + minus +
", primary=" + primary +
'}';
}
}
答案 0 :(得分:1)
在我看来,在&#34;添加&#34; class你可能有一个Map类型的属性,比如Map,其中K不是String
你能分享一下Adds类的样子吗?至少它的属性(字段)
<强> //修改
我刚刚写了一个有问题的androidTest(重要的是:在设备上运行以拥有真正的android环境):
@Test
public void myFirebaseTest(){
Adds adds = new Adds();
//adds.id = "id";
adds.setName("adds test name");
Item item = new Item("test name", 2.34);
item.addAdds(adds);
DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("test").setValue(item);
}
以下行注释掉我能够重现您的错误
//adds.id = "id";
取消注释它解决了问题
这是因为&#34; Item&#34;你有课:
public void addAdds(Adds adds){
this.adds.put(adds.getId(), adds);
}
其中&#34;添加&#34;是一个Java Map,你做的是
map.put(key, value)
,
但是adds.id(密钥)未设置(null)并导致提到的DatabaseException
答案 1 :(得分:1)
@Test
public void myFirebaseTest2(){
Adds adds = new Adds();
adds.setName("adds test name");
Item item = new Item();
item.adds = new HashMap<>();
//item.adds.put(null, adds);
item.adds.put("uniquekey", adds);
DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("test").setValue(item);
}
评论/取消注释测试方法的第5行重现DatabaseException并解释问题:
“添加”地图中的其中一个键很可能为空(未设置)