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.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之后错误地显示,所以我不知道如何解决这个问题,结果完全没有排序。

有什么建议吗?

注意

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

编辑

按照 Ryan Griggs 的建议,我在同一个数据库文件中包含了 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 vs 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 回答