这是一个奇怪的问题,我希望它有一个简单的解决方案。我有一个加密值的数据库。我创建了一个游标,它将遍历表中的每个条目,解密我需要的列中的值,并将值添加到变量“total”。我想要列中所有值的总和。这是代码:
while (c.moveToNext())
{
strTotal = c.getString(c.getColumnIndexOrThrow(KEY_TOTAL));
strTotal = sc.decrypt(strTotal);
total = Float.valueOf(strTotal) + total;
}
现在,这是一个奇怪的部分。假设我在数据库中有两个值:2 + 4.每个值解密后,它将正确添加它们:6。现在,如果值相等:2 + 2,例如,方法返回“2”而不是“4”。即使它以十进制结束(2 + 2.01 = 4.01,但2 + 2仍然输出2),也会发生这种情况。
我在这里缺少什么吗?谢谢!
编辑:
我已经更改了代码,只是为了查看解密是否是问题而且它仍然给我相同的结果:
float total = 0;
String strTotal = "10";
while (c.moveToNext())
{
try {
//strTotal = sc.decrypt(c.getString(c.getColumnIndex(KEY_TOTAL)));
total = Float.valueOf(strTotal) + total;
} catch (Exception e) {
Log.e(TAG, "exception", e);
}
}
此代码返回“10”,即使数据库中有3个条目!看起来如果数据库中的两行在KEY_TOTAL字段中具有相同的值,则返回的结果较少。这是查询:
Cursor c = mDb.query(true, DATABASE_TABLE, new String[] {KEY_TOTAL}, KEY_TYPE + "=" + t, null, null, null, null, null);
如果我拉出数据库并使用sqlite浏览器打开它,然后选择所有行,那么我仍然可以使用3。
答案 0 :(得分:0)
你检查过抛出异常吗?特别是NumberFormatException?我猜测还有一些其他逻辑问题导致循环过早退出。
答案 1 :(得分:0)
我刚检查了SQLite documentation for Android(我不是Android开发人员),我认为我发现了你的问题。查询方法的第一个参数是选择不同的行。由于您传递的是TRUE并且您只选择了一列,因此将从结果中删除重复项,这不是您想要的。
将您的查询电话更改为以下内容可以解决您的问题。
Cursor c = mDb.query(false, DATABASE_TABLE, new String[] {KEY_TOTAL},
KEY_TYPE + "=" + t, null, null, null, null, null);