【问题标题】:Firebase save Object with Map propertyFirebase 使用 Map 属性保存对象
【发布时间】:2017-11-29 19:49:12
【问题描述】:

我想知道是否可以保存包含 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 的实例。有没有办法像这样直接保存对象?或者我需要为地图做另一个设置值吗?

这里有两个类

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;
}

}

这里是添加

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 +
            '}';
}
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案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);
    }
    

    commenting/uncommenting 5th line of the test method重现了DatabaseException并解释了问题:

    很可能您的“添加”映射中的一个键为 null(未设置)

    【讨论】:

    • 谢谢!我的 id 未声明/未设置,我认为我的类结构有问题,所以我什至没有想过要检查这样的事情,谢谢!
    【解决方案2】:

    在我看来,在“Adds”类中,您可能有一个 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";
    

    取消注释解决了问题

    这是因为在“Item”类中你有:

    public void addAdds(Adds adds){
          this.adds.put(adds.getId(), adds);
    }
    

    其中“adds”是一个 Java Map,而您所做的是 map.put(key, value),

    但adds.id(键)未设置(null)并导致提到的DatabaseException

    【讨论】:

    • 我按照你的要求添加了课程。请注意,名称是这样的,因为我正在做一些原型并编写测试
    • 我已经编辑了我的原始答案,当您在“添加”地图中的一个键为空时会出现问题
    猜你喜欢
    • 2015-07-02
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2023-04-08
    相关资源
    最近更新 更多