我有一个包含这些列的表
|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;
}
}
}
但不起作用且光标结果为空
答案 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