我使用CursorLoader查询结果,这不是我要在ListFramgenet中显示的顺序。如何排序?
我用它来设置适配器:
mAdapter = new SimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_2, null,
new String[] { "name", "distance"},
new int[] { android.R.id.text1, android.R.id.text2 }, 0);
setListAdapter(mAdapter);
// Start out with a progress indicator.
setListShown(false);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
创建加载程序:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(),
Uri.withAppendedPath(TraceTable.CONTENT_URI, "latest"),
MEMBERS_PROJECTION,
null,
null,
null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.changeCursor(data);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
嗯,查询结果有纬度和经度。我想计算我的位置和这些结果之间的距离。并按距离排序asc。
如何排序?任何答案都会被批评
答案 0 :(得分:13)
实际上很容易:
来自:
new CursorLoader(getActivity(),
Uri.withAppendedPath(TraceTable.CONTENT_URI, "latest"),
MEMBERS_PROJECTION,
null,
null,
null);
到此:
// You could have them calculated in the projection like this:
String[] projection = { COLUMN1 + " * " + COLUMN2 + " as data", // Whatever your calculations are
COLUMN1, COLUMN2, COLUMN3, etc.. };
new CursorLoader(getActivity(),
Uri.withAppendedPath(TraceTable.CONTENT_URI, "latest"),
projection,
null,
null,
"data ASC");
请记住,如果您的提供商中有一些方法可以检查 投射并引发异常,您必须在进行测试时将其注释掉,或者添加新列 (您计算的那个)到你的官方投影阵列。
答案 1 :(得分:1)
将要作为CursorLoader()构造函数的最后一个参数排序的列名称作为字符串提供。如果要排序多个列,请用逗号分隔。如果要升序而不是降序,请在列名后添加DESC。所以你要在&#39; ORDER BY&#39;之后添加。在常规SQL语法中。
编辑:在下面回答你的评论。
是和否。我相信您可以将其用作排序顺序,但SQLite没有sqrt或power函数。但是,您可以定义自己的SQLite函数或使用第三方扩展。如果您不想走这条路线,那么您必须使用自己的自定义适配器而不是SimpleCursorAdapter,例如你将得到光标结果,然后将它们在代码中排序到另一个数据结构中,这将成为你的适配器的数据源。
答案 2 :(得分:1)
您正在寻找的是提供类似以下内容的sortOrder
参数:
(开头的ORDER BY
是implicait而你不包含它,为了清楚起见,这里只是包含在内
ORDER BY 6366000*acos(cos(lat_a / (180/3.14169))*cos(lng_a / (180/3.14169))*cos(lat_b / (180/3.14169))*cos(lng_b / (180/3.14169)) + t2 + t3) ASC
(为此我拿了answer here并内联它 - 除了我没有打扰t2和t3,因为它无论如何都不会起作用)
不幸的是,在标准SQLite中这是不可能的 - 没有运算符sin
或cos
- 甚至是平方根或幂运算符(在看到您的注释后只需要更简单的计算)
你可以add your own functions,但这是一个更复杂的路线。
根据您拥有的行数,您可以直接阅读所有行,然后自行对其进行排序。
答案 3 :(得分:0)
只需添加ContactsContract.Contacts.SORT_KEY_PRIMARY
。