Firebase使用Map属性保存对象

时间:2017-11-29 19:49:12

标签: android firebase firebase-realtime-database

我想知道是否可以保存包含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 +
            '}';
}
}

2 个答案:

答案 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并解释问题:

“添加”地图中的其中一个键很可能为空(未设置)