@DatabaseField(dataType=DataType.ENUM_STRING,columnName=TIPO_FIELD_NAME)
private TipoPedido tipo;
public enum TipoPedido {
REGISTARNOTIFICACAORESPOSTA("Registar Notificação Resposta",SIGLA_TIPO_REGISTARNOTIFICATIORESPOSTA);
private String tipoName;
private String tipoValue;
TipoPedido(String tipoName,String tipoValue){
this.tipoName=tipoName;
this.tipoValue=tipoValue;
}
public String getTipoName(){
return tipoName;
}
public String getTipoValue(){
return tipoValue;
}
}
是否可以使用tipoValue枚举属性作为列的值而不是序数?
编辑:这就是我所做的:
创建了MyEnumPersister类:
public class MyEnumPersister extends EnumStringType{
private static final MyEnumPersister singleTon = new MyEnumPersister();
/**
* @param sqlType
* @param classes
*/
protected MyEnumPersister() {
super(SqlType.STRING, new Class<?>[] { Enum.class });
}
public static MyEnumPersister getSingleton() {
return singleTon;
}
@Override
public Object javaToSqlArg(FieldType fieldType, Object obj) {
return ((EstadoPedido)obj).getEstadoValue();
}
@Override
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos)
throws SQLException {
return PedidoDTO.siglaEstadoPedidoComparator((String)sqlArg);
}
}
在javatoSqlArg中,我使用Enum中的getter直接返回与estadoValue对应的字符串。 我假设从DataBase返回到Enum我也需要实现sqlArgToJava方法,但我还没有构建它。
edit2:似乎当我对保存数据的表进行查询时,方法javaToSqlArg在sqlArgToJava之前被调用,为什么???这是查询:
public List<PedidoDTO> getPendingRequests(){
List<PedidoDTO> pendingReq=null;
QueryBuilder<PedidoDTO, Integer> queryBuild=null;
try {
queryBuild=getHelper().getPedidosDao().queryBuilder();
pendingReq=queryBuild.where().eq(PedidoDTO.ESTADO_FIELD_NAME, PedidoDTO.SIGLA_ESTADO_PENDENTE).query();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pendingReq;
}
obj值显示为“P”,当我将其插入数据库时,我将其转换为sql。没有多大意义......
答案 0 :(得分:5)
默认情况下,ORMLite存储枚举类型的字符串名称 - 在您的情况下,它将存储REGISTARNOTIFICACAORESPOSTA
。您可以使用ENUM_INTEGER
数据类型:
@DatabaseField(dataType=DataType.ENUM_INTEGER)
private TipoPedido tipo;
这会将integer
序数值存储在数据库中而不是字符串中。引用文档:
字符串名称是默认值(建议超过
ENUM_INTEGER
),因为它允许您在列表中的任何位置添加其他枚举,而不必担心以后必须转换数据。
但是,您似乎想要从枚举中存储tipoValue
字符串。要做到这一点,你需要注册一个自定义持久性。请参阅有关此内容的文档:
这允许您具体定义如何将Java字段转换为数据库表示形式,反之亦然。两个重要的方法是:
javaToSqlArg(...)
,它从Java转换为数据库格式和sqlArgToJava(...)
从数据库转换回Java。您可以扩展BaseDataType
并从头开始构建转换器,也可以扩展EnumStringType
或StringType
,并覆盖上述重要方法。
答案 1 :(得分:1)
我使用Enum.name()
方法填充Db列,使用Enum.valueOf()
来解析值。恕我直言,我认为不应该使用oridinals。
此外,您可能需要查看有关存储枚举值标签的信息:
Is there an Enum string resource lookup pattern for Android? 强文