7

我刚开始使用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}

4

3 回答 3

22

使用 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/阅读更多内容

于 2016-09-15T05:55:53.553 回答
7

最新版本的 GreenDao ( 2.x ) 包含非常适合您需求的功能。有一个自定义类型可以很容易地为枚举提供服务。

枚举

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"
);
于 2015-12-01T08:30:37.887 回答
2

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

解决此问题的一种选择是将 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());
于 2014-09-16T15:57:39.153 回答