我正在尝试通过CursorLoader从sqlite db查询数据。当我浏览android开发者网站的文档时,我找不到限制查询。
CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
如何在CursorLoader中实现限制?
先谢谢
答案 0 :(得分:29)
hackish方式:
String sortOrder = "ROWID LIMIT 5"
将导致ORDER BY ROWID LIMIT 5
。 ROWID
将按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可能会很好。希望这有帮助!