19

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

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

如何在 CursorLoader 中实现限制?

提前致谢

4

3 回答 3

29

骇人听闻的方式:

String sortOrder = "ROWID LIMIT 5"

这将导致ORDER BY ROWID LIMIT 5. ROWID将按 SQLite 保留的隐式行 ID 进行排序 - 非常接近于您根本不指定排序顺序时发生的情况。这并不是在滥用 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自己的合同,因此上述内容不适用于每个提供商。

于 2012-09-18T11:51:08.317 回答
1

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

于 2012-09-18T11:50:50.093 回答
0

我意识到这已经很晚了,但是sandrstar给了我一个想法,那就是使用你传递给 ContentProvider 的 Uri 并将限制作为最后一个路径段附加到它使用

Uri.withAppendedPath("uri" "/" + limitNumber);

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

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

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

uri.getLastPathSegment();

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

只是认为有一种好的技术可以将您的参数传递给 Provider 可能会很好。希望这可以帮助!

于 2015-03-18T23:07:42.370 回答