【问题标题】:What's the workaround for storing/retrieving enums in Firebase?在 Firebase 中存储/检索枚举的解决方法是什么?
【发布时间】:2019-04-02 00:06:57
【问题描述】:

首先,我认为我在项目后期才开始使用 Firebase 是我的错。

无论如何,我想做的是将 Pub 对象存储到数据库中。它包含各种信息,例如开放时间、评级、设施等。

问题不在于存储,而是每当我尝试从数据库中获取 pubs 列表时,都会遇到这个问题

这是错误。

 com.google.firebase.database.DatabaseException: Could not find enum value of com.example.matasolutions.pintindex.Day for value "Monday"
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToEnum(com.google.firebase:firebase-database@@16.1.0:302)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@16.1.0:212)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(com.google.firebase:firebase-database@@16.1.0:178)

这是枚举类。

public enum Day {
    MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
};

这就是带有枚举的构造函数的样子

public SingleOpeningHours(Day dayOfTheWeek,String openingTime, String closingTime){

        this.dayOfTheWeek = dayOfTheWeek;
        this.openingTime = openingTime;
        this.closingTime = closingTime;

    }

最后,这就是它被添加到列表然后到数据库的方式。


  ArrayList<SingleOpeningHours> singleOpeningHours = new ArrayList<SingleOpeningHours>();

        singleOpeningHours.add(new SingleOpeningHours(Day.MONDAY, "09:00", "00:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.TUESDAY, "09:00", "01:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.WEDNESDAY, "09:00", "01:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.THURSDAY, "09:00","01:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.FRIDAY, "09:00", "01:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.SATURDAY, "09:00", "01:00"));
        singleOpeningHours.add(new SingleOpeningHours(Day.SUNDAY, "09:00", "01:00"));

编辑:我有 7 个与正在存储的对象相关联的枚举类。最好的解决方法是什么?先谢谢各位了

【问题讨论】:

    标签: java android firebase firebase-realtime-database enums


    【解决方案1】:

    Firebase 数据库不支持枚举数据类型。要了解有关支持的数据类型的更多信息,请查看Supported data types

    解决方案 1:(最简单) 只需在不进行枚举的情况下使用字符串

    将 dayOfTheWeek 更改为字符串

    String dayOfTheWeek; // Changed from Day to String
    
    public SingleOpeningHours(String dayOfTheWeek,String openingTime, String closingTime){
    
        this.dayOfTheWeek = dayOfTheWeek;
        this.openingTime = openingTime;
        this.closingTime = closingTime;
    
    }
    

    并在 singleOpeningHours List 中使用字符串如下,

    ArrayList<SingleOpeningHours> singleOpeningHours = new ArrayList<SingleOpeningHours>();
    
        singleOpeningHours.add(new SingleOpeningHours("MONDAY", "09:00", "00:00"));
        singleOpeningHours.add(new SingleOpeningHours("TUESDAY", "09:00", "01:00"));
    

    解决方案2:将SingleOpeningHours对象中使用的dayOfTheWeek更改为字符串,并使用Enum Class中的name()方法将枚举值转换为字符串

    String dayOfTheWeek; // Changed from Day to String
    String openingTime;
    String closingTime;
    
    public SingleOpeningHours(Day dayOfTheWeek,String openingTime, String closingTime){
    
    this.dayOfTheWeek = dayOfTheWeek.name(); // make sure add .name()
    this.openingTime = openingTime;
    this.closingTime = closingTime;
    

    }

    在 singleOpeningHours 列表中使用枚举 Day(这里没有变化)

    ArrayList<SingleOpeningHours> singleOpeningHours = new ArrayList<SingleOpeningHours>();
    
    singleOpeningHours.add(new SingleOpeningHours(Day.MONDAY, "09:00", "00:00"));
    singleOpeningHours.add(new SingleOpeningHours(Day.TUESDAY, "09:00", "01:00"));
    

    希望这些解决方案能帮助您解决问题

    【讨论】:

    • 枚举员工{是,否}字符串_employee; _employee = Employee.Yes 对我不起作用。
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多