Android 可选的ORMLite和自定义数据过滤器<;双倍>;
有人知道如何为Guava的Android 可选的ORMLite和自定义数据过滤器<;双倍>;,android,guava,ormlite,Android,Guava,Ormlite,有人知道如何为Guava的可选? 因此,可以直接在实体代码中使用: @DatabaseField(columnName = "myField") Optional<Double> myField; @DatabaseField(columnName=“myField”) 可选的myField; 在最初的尝试之后,我发现了一些棘手的问题。例如:在mapper中注册Optional——似乎类型字典将其扁平化为Optional以下是我的实现,它仅向DB分配/从DB读取。 而不处理:语句
可选?
因此,可以直接在实体代码中使用:
@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
是一个坏主意(番石榴的作者可能会有所不同,因为他们使它可以序列化,我完全同意这种观点。