我正在尝试通过 CursorLoader 从 sqlite db 查询数据。当我浏览 android 开发者网站中的文档时,我找不到限制查询。
CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
如何在 CursorLoader 中实现限制?
提前致谢
我正在尝试通过 CursorLoader 从 sqlite db 查询数据。当我浏览 android 开发者网站中的文档时,我找不到限制查询。
CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
如何在 CursorLoader 中实现限制?
提前致谢
骇人听闻的方式:
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
自己的合同,因此上述内容不适用于每个提供商。
您可以使用SQLiteQueryBuilder提供具有LIMIT
子句能力的方法。或者您可以附加LIMIT
到您的选择字符串。
此外,还有一个选项可以通过 uri(作为其中的一部分)提供限制并在您的 ContentProvider 中处理它。
看起来CursorLoader
目前没有为它提供任何 API。
我意识到这已经很晚了,但是sandrstar给了我一个想法,那就是使用你传递给 ContentProvider 的 Uri 并将限制作为最后一个路径段附加到它使用
Uri.withAppendedPath("uri" "/" + limitNumber);
然后在您的内容提供者中,在您的 URI 匹配器中确保您匹配
MATCHER.addURI("authority", "uri" + "/#", matchInt);
然后在您的查询中,检查与 URI 匹配的 matchInt 并获取最后一个路径段
uri.getLastPathSegment();
这将是您的限制,然后使用 sandrstar 推荐的 SQLiteQueryBuilder。
只是认为有一种好的技术可以将您的参数传递给 Provider 可能会很好。希望这可以帮助!