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では、列挙型内のゲッターを使用して、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フィールドをデータベース表現に、またはその逆に変換する方法を具体的に定義できます。2つの重要な方法は次のとおりです。

コンバーターをゼロから拡張BaseDataTypeして構築することも、上記の重要なメソッドを拡張EnumStringTypeまたはStringTypeオーバーライドすることもできます。

于 2012-08-20T19:06:38.303 に答える
1

このメソッドを使用してEnum.name()、Db列にEnum.valueOf()入力し、値を解析して戻します。私見、私はオリジナルを決して使用すべきではないと思います。

また、列挙値のラベルの保存に関して、これを確認することをお勧めします。

Android用の列挙型文字列リソースルックアップパターンはありますか?強いテキスト

于 2012-08-20T17:44:35.683 に答える