0

これらの列を持つテーブルがあります

|Name|Quantity|Unit

そして、たとえば、測定単位に従ってサイズの降順に並べ替えられたデータを取得したい:

|Bread|1.2|Kg
|Pasta|600.21|g
|Flour|200.18|g
|Salt|70.12|mg
|Pepper|60.3|mg
|Venom|700.15|mcg

1.2600.21よりマイナーですが、単位はKgですので、目盛りに従ってKg > g > mg > mcgなどの順で優先されます (表記が 6Kg であるため、表に 6000g が含まれていないことを前提としています)。

このコードは明らかに機能しません

    public Cursor allDataSorted() {
        try {
            Cursor c = mDb.rawQuery(
                    "SELECT * FROM myTable order by Quantity desc", null);
            if (c != null) {
                c.moveToNext();
            }
            return c;
        } catch (SQLException mSQLException) {
            Log.e(TAG, "allDataSorted>>" + mSQLException.toString());
            throw mSQLException;
        }

    }

    }

そして、テーブル内のすべてのデータはテキスト文字列であるため、たとえば956は99の後に誤って表示されるため、この問題をどのように解決できるかわかりません。結果はまったくソートされていません。

なにか提案を?

注意

テーブルを変換して再変換することはできません。これらは大きすぎます。また、アダプターが多すぎる種類のユニットに使用されているため、一般的なベース ユニットのみを使用できません。

編集

Ryan Griggs の提案に従って、同じ db ファイルにmapperTbテーブルを含めました。

Unit|Multipler
hg|100
g|1
dg|0.1
cg|0.01
mg|0.001
mcg|0.000001

そして、次のように allDataSorted() メソッドを編集しました。

    public Cursor allDataSorted() {
        try {
            Cursor c = mDb.rawQuery("SELECT *, (CAST(myTable.Quantity as FLOAT) * mapperTb.Multipler) as Quantity FROM myTable INNER JOIN mapperTb ON myTable.Unit = mapperTb.Unit ORDER BY Quantity desc", null);
            if (c != null) {
                c.moveToNext();
            }
            return c;
        } catch (SQLException mSQLException) {
            Log.e(TAG, "allDataSorted>>" + mSQLException.toString());
            throw mSQLException;
        }

    }

    }

しかし機能せず、カーソルの結果は空です

4

1 に答える 1

1

ソート ルーチンでは、すべての値を基本単位 (つまり、グラム) に変換することをお勧めします。その後、適切に並べ替えることができます。各単位を適切な乗数 (つまり、Kg = 1000、g = 1) にマップする別のテーブルを作成し、各エントリの基本単位を計算して、その値で並べ替えることができます。そうすれば、6000g 対 6Kg などを気にする必要はありません。

例: フィールド 'unit' と 'multiplier' を持つマッピング テーブル "unit_map" を作成します。該当するすべての単位と乗数を追加します。したがって、新しいクエリは次のようになります。

SELECT *, (CAST(myTable.Quantity as FLOAT) * unit_map.multiplier) as sort_field FROM myTable INNER JOIN unit_map ON myTable.Unit = unit_map.unit ORDER BY sort_field
于 2012-12-13T19:16:05.397 に答える