所以我发布了这个问题,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 thesqlArgToJava
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 字段是 EstadoPedido
或 TipoPedido
,您传递给 eq
方法的值也应该是那个值。
因此您的 QueryBuilder
eq
调用应该使用枚举值而不是 String
并且应该更改为某些东西喜欢:
where().eq(PedidoDTO.ESTADO_FIELD_NAME, EstadoPedido.PENDENTE)
我想我是对的。
关于android - 进行选择查询时调用javaToSqlArg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112833/