按SQLite中的选择参数顺序对查询结果进行排序

时间:2016-01-18 16:16:10

标签: android sqlite

所以我正在做的是: 有特定顺序的歌曲。 我正在存储歌曲的ID列表,以便我可以稍后以相同的顺序获取它们。

我在变量in中存储了ID列表,这就是我提取它们的方式:

StringBuilder sb = new StringBuilder( in.length * 2 - 1 );
        sb.append( "?" );
        for ( int i = 1; i < in.length; i ++ )
        {
            sb.append( ",?" );
        }
        String strIn = sb.toString( );

songCursor = context.getContentResolver( ).query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, TRACK_COLUMNS,
                    MediaStore.MediaColumns._ID + " IN (" + strIn + ")", in, null );

一切正常,唯一的问题是,列表的顺序与存储的顺序不同。在这里,我不能使用排序顺序,因为很明显我没有指定我想要的顺序。我希望它按存储顺序排列,但我不知道如何做到这一点。

这也是将鼠标悬停在查询上时给出的信息,因此可以解释原因,但我没有解决方案。

  

selectionArgs您可以在选择中包含?,它将被替换   来自selectionArgs的值,按它们出现在的顺序排列   选择。

例如:

enter image description here

在上图中,我按照它们的顺序存储所有歌曲的ID。

enter image description here

但是当我检索它们时,订单会改变。

1 个答案:

答案 0 :(得分:2)

按照this post中的示例,下面的代码为CASE调用中的sortOrder参数和query()参数构建selection表达式。

StringBuilder inStr = new StringBuilder(MediaStore.MediaColumns._ID)
    .append(" IN (?");

StringBuilder orderStr = new StringBuilder("CASE ")
    .append(MediaStore.MediaColumns._ID)
    .append(" WHEN ")
    .append(in[0])
    .append(" THEN 0");

for (int i = 1; i < in.length; i++) {
    inStr.append(",?");

    orderStr.append(" WHEN ")
        .append(in[i])
        .append(" THEN ")
        .append(i);
}

inStr.append(")");

orderStr.append(" END, ")
    .append(MediaStore.MediaColumns._ID)
    .append(" ASC");

Cursor songCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                               TRACK_COLUMNS,
                                               inStr.toString(),
                                               in,
                                               orderStr.toString());

CASE表达式实质上是为每个ID分配别名值以进行排序,而不是按实际ID值排序。无论选择中的第一个ID是什么,其别名值为0,第二个为1,第三个为2,等等。按这些值递增排序,得到Cursor将按照选择中传递的ID的顺序排列。