android - 进行选择查询时调用javaToSqlArg?

标签 android enums ormlite

所以我发布了这个问题,Using enum property as ormlite column value instead of ordinal. is it possible? ,关于如何使用 anum 属性值作为传递给数据库的值而不是名称,它起作用了。我使用 javaToSqlArg 方法(用于插入数据库)和 sqlArgoToJava 方法创建了持久类,用于将数据从数据库检索到对象。

问题似乎是在做后者时。 javaToSqlArg 方法在 sqlArgToJava 之前调用,这是我希望在进行 select 查询时直接调用的方法。这里又是持久类:

public class MyEnumPersister extends EnumStringType{

    private static final MyEnumPersister singleTon = new MyEnumPersister();

    protected MyEnumPersister() {
        super(SqlType.STRING, new Class<?>[] { Enum.class });
    }

    public static MyEnumPersister getSingleton() {
        return singleTon;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object obj) {
        if(obj instanceof EstadoPedido){
            return ((EstadoPedido)obj).getEstadoValue();
        }else if(obj instanceof TipoPedido){
            return ((TipoPedido)obj).getTipoValue();
        }
        return obj;
    }               

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException {
        if(fieldType.getColumnName().equals(PedidoDTO.ESTADO_FIELD_NAME)){  
            return PedidoDTO.siglaEstadoPedidoComparator((String)sqlArg);
        }else{
            return PedidoDTO.siglaTipoPedidoComparator((String)sqlArg);
        }
    }
}

还有 dto 类:

public class PedidoDTO extends IpdmsMobileDTO {

    private static final long serialVersionUID = 268620648774735484L;

    public final static String SIGLA_ESTADO_ENVIADO="E";
    public final static String SIGLA_ESTADO_PENDENTE="P";
    public final static String SIGLA_ESTADO_CANCELADO="C";
    public final static String SIGLA_ESTADO_CANCELADOALTERADO="CAP";

    public final static String SIGLA_TIPO_REGISTARNOTIFICATIORESPOSTA="RNR";

    //ormlime column names
    public final static String ESTADO_FIELD_NAME = "estado";
    public final static String TIPO_FIELD_NAME = "tipo";
    public final static String DATAENVIO_FIELD_NAME = "data_envio";
    public final static String ENTIDADE_ID_FIELD_NAME = "entidade_id";

    @DatabaseField(columnName=ESTADO_FIELD_NAME, persisterClass=MyEnumPersister.class)
    private EstadoPedido estado;
    @DatabaseField(columnName=TIPO_FIELD_NAME,  persisterClass=MyEnumPersister.class)
    private TipoPedido tipo;
    @DatabaseField(columnName=DATAENVIO_FIELD_NAME)
    private Date dataEnvio;
    @DatabaseField(columnName=ENTIDADE_ID_FIELD_NAME)
    private int idEntidade;

    public PedidoDTO() {
        //for ormlite
    }   

    public EstadoPedido getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado=siglaEstadoPedidoComparator(estado);
    }

    public static EstadoPedido siglaEstadoPedidoComparator(String estado){
        if (estado.equals(SIGLA_ESTADO_PENDENTE))
            return EstadoPedido.PENDENTE;
        else if (estado.equals(SIGLA_ESTADO_ENVIADO))
            return EstadoPedido.ENVIADO;
        else if(estado.equals(SIGLA_ESTADO_CANCELADO))
            return EstadoPedido.CANCELADO;
        else
            return EstadoPedido.CANCELADOALTERADOPREV;
    }

    public TipoPedido getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        //set tipo do pedido
        this.tipo =siglaTipoPedidoComparator(tipo);
    }

    public static TipoPedido siglaTipoPedidoComparator(String tipo){
        return TipoPedido.REGISTARNOTIFICACAORESPOSTA;
    }

    public enum EstadoPedido{
        ENVIADO  ("Enviado"  ,SIGLA_ESTADO_ENVIADO), 
        PENDENTE ("Pendente" ,SIGLA_ESTADO_PENDENTE),
        CANCELADO("Cancelado",SIGLA_ESTADO_CANCELADO),
        CANCELADOALTERADOPREV("Cancelado/Alterado Previamente",SIGLA_ESTADO_CANCELADO);

        private String estadoName;  
        private String estadoValue;

        EstadoPedido(String estadoName,String estadoValue){
            this.estadoName=estadoName;
            this.estadoValue=estadoValue;
        }

        public String getEstadoName(){
            return estadoName;
        }

        public String getEstadoValue(){
            return estadoValue;
        }
    }

    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;
        }
    }
}

和查询:

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;
}

最佳答案

The javaToSqlArg method is called before the sqlArgToJava which was the one I expected to be called directly when making select queries. Once again here is the persist class:

ORMLite试图与这个@Max 保持一致。您将一个 Java 值传递给 eq 比较方法,它会尝试对其执行与将其存储到数据库时相同的转换。在这种情况下,由于 Java 字段是 EstadoPedidoTipoPedido,您传递给 eq 方法的值也应该是那个值。

因此您的 QueryBuilder eq 调用应该使用枚举值而不是 String 并且应该更改为某些东西喜欢:

where().eq(PedidoDTO.ESTADO_FIELD_NAME, EstadoPedido.PENDENTE)

我想我是对的。

关于android - 进行选择查询时调用javaToSqlArg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112833/

相关文章:

c++ - C++ 中枚举的获取和设置

android - Kotlin 是否 100% 支持 Ormlite? (数据类)

android - rawQuery 中的 ORMLite 别名

android - 将对象绘制为类字段与局部变量

Android - 旋转切掉形状的角

java - SD卡中的二维数组太慢

enums - F# 枚举 : expected to have type xxx but here has type xxx

scala - 特殊值的字符串表示

android - 如何将预制数据库导入由 ormlite 管理的 sqlite

android - 权重的变化在布局中没有生效