获取数据按SQLite中的度量单位降序排序

时间:2012-12-13 19:13:36

标签: android sorting android-sqlite

我有一个包含这些列的表

|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.2 小于 600.21 ,但单位为 Kg ,因此在顺序中,优先级在按比例 Kg>之前。 g> mg> mcg 等 (假设表格不包含6000g因为符号为6Kg)

此代码显然不起作用

    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 之后错误显示,所以我不知道如何解决这个问题和结果完全未分类。

有什么建议吗?

NB

我无法转换和重新转换表格, 这些太大了,适配器用于太多类型的单元,只能使用一般的基本单元。

修改

根据Ryan Griggs的建议,我已将 mapperTb 表包含在同一个db文件中

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;
        }

    }

    }

但不起作用且光标结果为空

1 个答案:

答案 0 :(得分:1)

我建议您在排序例程中将所有值转换为基本单位(即Grams)。然后你可以正确排序。您可以创建另一个表,将每个单位映射到适当的乘数(即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