限制CursorLoader中的查询

时间:2012-09-18 11:40:24

标签: android android-cursorloader

我正在尝试通过CursorLoader从sqlite db查询数据。当我浏览android开发者网站的文档时,我找不到限制查询。

CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

如何在CursorLoader中实现限制?

先谢谢

3 个答案:

答案 0 :(得分:29)

hackish方式:

String sortOrder = "ROWID LIMIT 5"

将导致ORDER BY ROWID LIMIT 5ROWID将按SQLite保留的隐式行ID排序 - 非常接近于您根本没有指定排序oder时发生的行。 并不是说这是滥用order参数不检查提供的值是否只是有效订单类型的事实。一种缓冲区溢出攻击。

更好的方法是定义Uri参数。

// query code
Uri queryUri = Uri.parse("content://what/ever/items");
queryUri = queryUri.buildUpon().appendQueryParameter("limit", "5").build();

// in ContentProvider
String limit = queryUri.getQueryParameter("limit");

这两种方法仅在ContentProvider与上述限制尝试兼容时才有效。实际上没有明确定义的方法来限制或选择ContentProvider中的某些数据。每个ContentProvider都附带了自己的合同,因此上述内容不适用于所有提供商。

答案 1 :(得分:1)

您可以使用SQLiteQueryBuilder方法,这些方法可以提供LIMIT子句。 或者您只需将LIMIT附加到您的选择字符串即可 此外,还可以选择通过uri(作为其一部分)提供限制并在ContentProvider中处理它。
看起来CursorLoader目前没有为它提供任何API。

答案 2 :(得分:0)

我意识到这已经很晚了,但是sandrstar给了我一个想法,即使用你传递给ContentProvider的Uri并使用

将限制作为最后一个路径段添加到它
Uri.withAppendedPath("uri" "/" + limitNumber);

然后在您的内容提供商内部,在您的URI匹配器中确保匹配

MATCHER.addURI("authority", "uri" + "/#", matchInt); 

然后在您的查询中,检查您匹配URI的matchInt并获取最后一个路径段

uri.getLastPathSegment();

这将是您的限制,然后使用SQLiteQueryBuilder推荐的sandrstar。

我认为有一个很好的技术可以让你的参数提供给Provider可能会很好。希望这有帮助!