0

これは奇妙な問題であり、簡単な解決策があることを願っています。暗号化された値を持つデータベースがあります。テーブル内の各エントリを調べ、必要な列から値を復号化し、値を変数「total」に追加するカーソルを作成しました。列のすべての値の合計が必要です。コードは次のとおりです。

while (c.moveToNext())
      {           
            strTotal = c.getString(c.getColumnIndexOrThrow(KEY_TOTAL));
            strTotal = sc.decrypt(strTotal);
            total = Float.valueOf(strTotal) + total;             
      }

さて、ここに奇妙な部分があります。データベースに2つの値があると仮定します: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);
            }           
      }

データベースに3つのエントリがあるにもかかわらず、このコードは「10」を返します。データベースの2つの行のKEY_TOTALフィールドの値が同じである場合、返される結果は少なくなるようです。クエリは次のとおりです。

Cursor c = mDb.query(true, DATABASE_TABLE, new String[] {KEY_TOTAL}, KEY_TYPE + "=" + t, null, null, null, null, null);

dbをプルしてsqliteブラウザーで開き、すべての行をSELECTすると、3が表示されます。

4

2 に答える 2

0

Android用のSQLiteドキュメントを確認しました(私はAndroid開発者ではありません)。問題が見つかったと思います。queryメソッドの最初の引数は、個別の行を選択するかどうかです。TRUEを渡し、1つの列のみを選択しているため、結果から重複が削除されますが、これは目的の結果ではありません。

クエリの呼び出しを次のように変更すると、問題が解決するはずです。

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 に答える
0

スローされた例外をチェックしましたか?特にNumberFormatException?ループが途中で終了する原因となっている他の論理的な問題があると思います。

于 2013-01-02T05:56:32.637 に答える