我刚开始使用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}
答案 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());