1
@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 对应的字符串。我假设要将它从数据库中返回到枚举,我也需要实现 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 的值。没有太多意义......

4

2 回答 2

5

默认情况下,ORMLite 存储枚举类型的字符串名称——在您的情况下,它将存储REGISTARNOTIFICACAORESPOSTA. 您可以使用以下ENUM_INTEGER数据类型覆盖此行为并存储序数值:

@DatabaseField(dataType=DataType.ENUM_INTEGER)
private TipoPedido tipo;

这会将integer序数值存储在数据库中,而不是字符串。引用文档:

字符串名称是默认的(并且建议超过ENUM_INTEGER),因为它允许您在列表中的任何位置添加额外的枚举,而不必担心以后必须转换数据。

但是,您似乎想存储tipoValue枚举中的字符串。为此,您必须注册一个自定义持久化器。请参阅有关此的文档:

http://ormlite.com/docs/custom-persister

这允许您具体定义如何将 Java 字段转换为数据库表示,反之亦然。两个重要的方法是:

您可以BaseDataType从头开始扩展和构建转换器,或者您可以扩展EnumStringTypeStringType仅覆盖上述重要方法。

于 2012-08-20T19:06:38.303 回答
1

我使用该Enum.name()方法填充 Db 列并将Enum.valueOf()值解析回来。恕我直言,我认为永远不应该使用序数。

此外,您可能想看看这个关于存储枚举值标签的内容:

是否有适用于 Android 的枚举字符串资源查找模式?强文本

于 2012-08-20T17:44:35.683 回答