Android 可选的ORMLite和自定义数据过滤器<;双倍>;

Android 可选的ORMLite和自定义数据过滤器<;双倍>;,android,guava,ormlite,Android,Guava,Ormlite,有人知道如何为Guava的可选? 因此,可以直接在实体代码中使用: @DatabaseField(columnName = "myField") Optional<Double> myField; @DatabaseField(columnName=“myField”) 可选的myField; 在最初的尝试之后,我发现了一些棘手的问题。例如:在mapper中注册Optional——似乎类型字典将其扁平化为Optional以下是我的实现,它仅向DB分配/从DB读取。 而不处理:语句

有人知道如何为Guava的
可选

因此,可以直接在实体代码中使用:

@DatabaseField(columnName = "myField")
Optional<Double> myField;
@DatabaseField(columnName=“myField”)
可选的myField;

在最初的尝试之后,我发现了一些棘手的问题。例如:在mapper中注册
Optional
——似乎类型字典将其扁平化为
Optional

以下是我的实现,它向DB分配/从DB读取。
不处理:语句中的参数,全局类型

在使用之前,它值得一读

用例:

@DatabaseField(columnName = "myField", persisterClass = OptionalDoubleType.class)
Optional<Double> myField;
@DatabaseField(columnName=“myField”,persisterClass=optionaldubletype.class)
可选的myField;
坚持者:

public class OptionalDoubleType extends BaseDataType {

    private static final OptionalDoubleType singleton = new OptionalDoubleType();

    public static OptionalDoubleType getSingleton() {
        return singleton;
    }

    private OptionalDoubleType() {
        super(SqlType.DOUBLE, null);
    }

    protected OptionalDoubleType(SqlType sqlType, Class<?>[] classes) {
        super(sqlType, classes);
    }


    @Override
    public Object resultToJava(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
        double aDouble = results.getDouble(columnPos);
        if (results.wasNull(columnPos))
            return Optional.absent();
        else
            return Optional.of(aDouble);
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException {
        Optional<Double> optDbl = (Optional<Double>) javaObject;
        if (optDbl.isPresent())
            return optDbl.get();
        else
            return null;
    }

    @Override
    public Object parseDefaultString(FieldType fieldType, String defaultStr) throws SQLException {
        throw new UnsupportedOperationException();
    }

    @Override
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
        throw new UnsupportedOperationException();
    }

    // BUGFIX: there is a bug in ORMLite which causes that
    // decoding 'sql null' to Optional.absent() is wrong when 
    // Entity with Optional<Double> is read as "child entity".
    // It fixes the bug [ugly but works ;]
    @Override
    public boolean isStreamType() {
        return true;
    }


}
公共类OptionalDoubleType扩展BaseDataType{
私有静态最终OptionalDoubleType单例=新OptionalDoubleType();
公共静态选项DoubleType getSingleton(){
返回单身;
}
私有OptionalDoubleType(){
super(SqlType.DOUBLE,null);
}
受保护的OptionalDoubleType(SqlType SqlType,类[]类){
super(sqlType,classes);
}
@凌驾
公共对象resultToJava(FieldType、FieldType、DatabaseResults、int columnPos)抛出SQLException{
double-aDouble=results.getDouble(columnPos);
if(results.wasNull(columnPos))
返回可选的。缺席();
其他的
返回可选。of(a加倍);
}
@凌驾
公共对象javaToSqlArg(FieldType FieldType,Object javaObject)抛出SQLException{
可选optDbl=(可选)javaObject;
if(optDbl.isPresent())
返回optDbl.get();
其他的
返回null;
}
@凌驾
公共对象parseDefaultString(FieldType FieldType,String defaultStr)抛出SQLException{
抛出新的UnsupportedOperationException();
}
@凌驾
公共对象resultToSqlArg(FieldType FieldType、DatabaseResults results、int columnPos)引发SQLException{
抛出新的UnsupportedOperationException();
}
//错误修正:ORMLite中有一个导致该问题的错误
//在以下情况下,将“sql null”解码为Optional.缺席()是错误的
//带有可选项的实体被读取为“子实体”。
//它修复了错误[丑陋但有效;]
@凌驾
公共布尔值isStreamType(){
返回true;
}
}
请注意,存在以下问题。因此,即使是JDK8的作者也认为在这种情况下,
Optional
是一个坏主意(番石榴的作者可能会有所不同,因为他们使它可以
序列化,我完全同意这种观点。