android mergecursor 排序,如何对CursorLoader结果进行排序?

我使用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 onCreateLoader(int id, Bundle args) { return new CursorLoader(getActivity(), Uri.withAppendedPath(TraceTable.CONTENT_URI, "latest"), MEMBERS_PROJECTION, null, null, null); } public void onLoadFinished(Loader loader, Cursor data) { mAdapter.changeCursor(data); // The list should now be shown. if (isResumed()) { setListShown(true); } else { setListShownNoAnimation(true); } }

嗯,查询结果有纬度和经度。 我想计算我的位置和这些结果之间的距离。 并按距离asc排序。

怎么排序呢? 任何答案都会被批评

这实际上非常简单:

由此:

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");

请记住 ,如果您的提供程序中有一些方法可以检查投影并引发exception,那么您必须在进行测试时添加注释或添加新列 (您使用)到您的官方投影arrays。

您正在寻找的是提供类似以下内容的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

(为此我在这里给出答案并将其内联 – 除了我没有打扰t2和t3,因为它无论如何都不会起作用)

不幸的是,这在标准的SQLite中是不可能的 – 没有运算符sin或cos – 甚至是平方根或幂运算符(在看到你的评论之后只需要更简单的计算)。

您可以添加自己的function ,但这是一个更复杂的路线。

根据您拥有的行数,您可以直接阅读所有行,然后自行对其进行排序。

将要排序的列名称作为字符串作为CursorLoader()构造函数的最后一个参数提供。 如果要排序的列数多,请用逗号分隔。 如果要升序而不是降序,请在列名后添加DESC。 所以你要在常规SQL语法中的’ORDER BY’之后添加它。

编辑:在下面回答你的评论。

是的,不是。 我相信您可以将其用作排序顺序,但SQLite没有sqrt或power函数。 但是,您可以定义自己的SQLite函数或使用第三方扩展。 如果你不想走那条路,你将不得不使用你自己的自定义适配器而不是SimpleCursorAdapter,例如,你将获得光标结果,然后将它们在代码中排序到另一个数据结构中,这将成为你的适配器的数据源。

只需添加ContactsContract.Contacts.SORT_KEY_PRIMARY 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值