これらの列を持つテーブルがあります
|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などの順で優先されます (表記が 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;
}
}
}
しかし機能せず、カーソルの結果は空です