2013-11-20 94 views
0

我正在研究一个应用程序,它将所有内容存储在数据库中,并使用ContentProvider进行访问。我的场景如下:ContentProvider/ContentResolver查询按ID排序默认

  • 我打了一个Web调用并接收一个整数列表,它们代表了我需要从设备上的数据库检索的对象的ID。
  • 我使用以下选项拨打ContentResolver.query():

    选择:_id =? OR _id =? OR _id =?

    选择标识:30; 165; 149;

  • 所以,我需要得到所有项目的id是30,165或149.我需要他们在确切的顺序

这是我在ContentResolver的制作精确电话:

Cursor cursor = mActivity.getContentResolver().query(myUri, null, selection, selectionIds, null); 

正如你所看到的,我没有任何分拣阶段。但是,结果为我提供了一个Cursor,顺序如下:30,149,165。因此,即使我没有指定任何排序顺序,它似乎默认通过_id排序。我的问题是,有没有人知道阻止这种情况发生的方法?

回答

1

当您从任何数据库中选择行而未指定ORDER BY子句时,应该将结果顺序视为未定义,即可以按任何顺序返回。你在这里按_id排序的原因仅仅是由于情况 - 它们可能是按照底层数据库文件的顺序排列的,所以这是SQLite读取它们的顺序。但是,假设它总是会不安全是这样。

因此,您的问题的实际答案是否定的,您不能假定SQLite将以任何特定顺序返回您的行,而没有ORDER BY子句。如果您无法提供这样的条款(这里似乎是这种情况),您必须在从光标获取所有数据后,使用代码对它们进行排序。

+0

啊,好的。感谢您花时间解释。我将按照我希望他们从数据库中获得的方式进行排序。我曾假设它会是这样,但那是错误的。 – ariets

1

这不是默认为_id,它给你的记录,因为它们在数据库(这恰好是按ID排序)。如果你不想要这个,请传递你自己的排序顺序。

+0

感谢您的回答。正如我在其他答案中所说的,我认为他们会按照我要求的顺序出来,但这是一个令人难以置信的错误假设。再次感谢。 – ariets