在我的Android应用中,我有以下课程:
@DatabaseTable(tableName="things")
public class Thing {
public static final String ID_FIELD_NAME = "id";
public static final String FLOAT_FIELD_NAME = "myFloatField";
@DatabaseField(generatedId=true,columnName=ID_FIELD_NAME)
private int id;
@DatabaseField(columnName=FLOAT_FIELD_NAME)
private float myFloatField;
//[snip constructor and getters]
}
然后,在我的DBManager中,我执行以下操作:
Dao<Thing, Integer> dao = helper.getThingDao();
Thing tmp = dao.queryBuilder()
.where()
.eq(Thing.FLOAT_FIELD_NAME, otherThing.getFloatField());
事实证明偶尔tmp
的证据是null
。
我尝试了许多不同的东西,而且每次我发现正在努力获得正确Thing
的内容如下:
Dao<Thing, Integer> dao = helper.getThingDao();
Thing tmp = dao.queryBuilder()
.where()
.eq(Thing.FLOAT_FIELD_NAME, Double.valueOf(otherThing.getFloatField()));
我读了the docs:
float或Float(DataType.FLOAT或DataType.FLOAT_OBJ)作为SQL保留 键入FLOAT。
double或Double(DataType.DOUBLE或DataType.DOUBLE_OBJ)保持为 SQL类型DOUBLE。
所以我的问题是:
这是我的代码中的一个错误(但我不知道如何,我没有正确使用where()
?),一个奇怪的东西ormlite与float
s或其他完全一样?< / p>
编辑:我正在使用ormlite-core-4.48.jar和ormlite-android-4.48.jar。
编辑2:还有什么,如果我将字段从float
更改为double
然后执行查询,它仍然无法正常工作。我需要使用Double.valueOf()
。
答案 0 :(得分:0)
避免==测试浮点数,因为大多数浮点数无法准确表示,并且舍入误差很常见。
而不是等于,测试abs(a - b) < epsilon
,其中epsilon是您接受的差异。
SQL:
SELECT a, b from myTable where abs(a - b) < 0.001
对ORMLite不太熟悉,但我发现你可以做where.raw(sql)
,这至少应该允许你这样做。