【问题标题】:Sorting query results by order of selection arguments in SQLite在 SQLite 中按选择参数的顺序对查询结果进行排序
【发布时间】:2016-01-18 16:16:10
【问题描述】:

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

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

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 您可以在选择中包含 ?s,它将被替换 通过 selectionArgs 中的值,按照它们出现在 选择。

例如:

在上图中,我按顺序存储了所有歌曲的id。

但是当我检索它们时,顺序发生了变化。

【问题讨论】:

  • 如果我理解正确,请按MediaStore.MediaColumns.DATE_ADDED 列排序。
  • 不不,如果有歌曲列表,则顺序必须与添加歌曲/ID 的顺序相匹配
  • 好的。加了什么呢?
  • 现在我存储 ids,然后再检索它们,应该保持歌曲的原始顺序,这不会发生
  • 顺序必须与添加歌曲/id 的顺序相匹配,假设现在有一个歌曲列表,我存储了 id,然后我稍后尝试检索它们。应该保持存储歌曲 ID 的原始顺序,这不会发生

标签: android sqlite


【解决方案1】:

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

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 的顺序。

【讨论】:

  • 工作,但你能添加解释吗?发生了什么?
猜你喜欢
  • 2013-10-13
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多