如何对CursorLoader结果进行排序?

时间:2013-12-19 16:11:42

标签: android simplecursoradapter android-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<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。

如何排序?任何答案都会被批评

4 个答案:

答案 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中这是不可能的 - 没有运算符sincos - 甚至是平方根或幂运算符(在看到您的注释后只需要更简单的计算)

你可以add your own functions,但这是一个更复杂的路线。

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

答案 3 :(得分:0)

只需添加ContactsContract.Contacts.SORT_KEY_PRIMARY