如何在GreenDAO中映射Enum

时间:2013-07-31 04:24:52

标签: android orm enums greendao

我刚开始使用greenDAO。 如何添加枚举属性?

我的想法:使用实体的addIndex属性。

private static void main() {

    // TODO Auto-generated method stub
    static Schema blah;
    Entity unicorn = blah.addEntity("Weather");
    unicorn.addIdProperty();
    unicorn.addIntProperty("currentAirTemp");
    unicorn.addIndex("shirtSize");
}

这是正确的方法吗?

目标:我想从套装中引用shirtSize:{XS,S,M,L,XL,XXL}

3 个答案:

答案 0 :(得分:19)

使用GreenDAO 3,我们现在可以选择@convert

使用PropertyConverter注释
@Entity
public class User {
    @Id
    private Long id;

    @Convert(converter = RoleConverter.class, columnType = String.class)
    private Role role;

    enum Role {
        DEFAULT, AUTHOR, ADMIN
    }

    static class RoleConverter implements PropertyConverter<Role, String> {
        @Override
        public Role convertToEntityProperty(String databaseValue) {
            return Role.valueOf(databaseValue);
        }

        @Override
        public String convertToDatabaseValue(Role entityProperty) {
            return entityProperty.name();
        }
    }
}

http://greenrobot.org/objectbox/documentation/custom-types/

了解详情

答案 1 :(得分:7)

最新版本的GreenDao(2.x)包含最适合您需求的功能。有Custom Types可以很容易地为枚举服务。

枚举

public enum ShirtSize {
    XS(1),
    S(2),
    M(3),
    L(4),
    XL(5),
    XXL(6);

    private final int value;

    ShirtSize(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
}

转换器

public class ShirtSizeConverter implements PropertyConverter<ShirtSize, Integer> {
@Override
public ShirtSize convertToEntityProperty(Integer databaseValue) {
    if(databaseValue == null) {
        return null;
    } else {
        for(ShirtSize value : ShirtSize.values()) {
            if(value.value() == databaseValue) {
                return value;
            }
        }

        throw new DaoException("Can't convert ShirtSize from database value: " + databaseValue.toString());
    }
}

@Override
public Integer convertToDatabaseValue(ShirtSize entityProperty) {
    if(entityProperty == null) {
        return null;
    } else {
        return entityProperty.value();
    }
}

}

实体字段声明(在生成器中)

entity.addIntProperty("ShirtSize").customType(
    "com.your_package.ShirtSize",
    "com.your_package.ShirtSizeConverter"
);

答案 2 :(得分:2)

据我所知,由于绿色不稳定,因此不支持enums。 此外,它们是一个容易出错的组件,可以添加到数据库逻辑中,因为枚举元素的值可以更改。

解决这个问题的一个选择是将Int属性添加到数据库,然后将Enum序数值映射到该字段,如下所示:

// add the int property to the entity
unicorn.addIntProperty("shirtSize");

// create the enum with static values
public enum ShirtSize {
    XS(1), S(2), M(3), L(4), XL(5), XXL(6);

    private final int value;

    private ShirtSize(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
}

// set the ordinal value of the enum
weather.setShirtSize(ShirtSize.XL.value());