0

这是一个奇怪的问题,我希望它有一个简单的解决方案。我有一个带有加密值的数据库。我创建了一个游标,它将遍历表中的每个条目,解密我需要的列中的值,并将值添加到变量“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,但是。

4

2 回答 2

0

你检查过抛出的异常吗?特别是 NumberFormatException?我猜还有其他一些逻辑问题导致循环过早退出。

于 2013-01-02T05:56:32.637 回答
0

我刚刚检查了Android 的 SQLite 文档(我不是 Android 开发人员),我想我发现了你的问题。查询方法的第一个参数是是否选择不同的行。由于您传递 TRUE 并且您只选择一列,因此将从结果中删除重复项,这不是您想要的。

将您的查询调用更改为以下内容应该可以解决您的问题。

Cursor c = mDb.query(false, DATABASE_TABLE, new String[] {KEY_TOTAL},
    KEY_TYPE + "=" + t, null, null, null, null, null);
于 2013-01-02T21:28:48.580 回答