在应用程序中实现过滤时,我有几个与official LoaderManager example相关的问题(即SQLite数据库,使用Content Provider,未使用过滤时使用CONTENT_URI,或者通过串联CONTENT_FILTER_URI形成URI进行过滤) mCurFilter
变量的内容。
Fistly,我需要确认,我才能正确理解过滤URI。之前,我确实使用了CONTENT_URI
并设置了selection
,selectionArgs
,和sortOrder
在实施new CursorLoader(...)
的活动的onCreateLoader
方法中创建LoaderManager.LoaderCallbacks<Cursor>
时。我不明白为什么其他人使用特殊的CONTENT_FILTER_URI。
官方示例为null
传递selectionArgs
,过滤器值可能会被提取为filter = uri.getLastPathSegment();
并添加用于selectionArgs
。在我的情况下,我也将null
传递给selection
并在内容提供商中形成,如:
selection = ProductTable.COLUMN_NAME + " like ?";
selectionArgs = new String[]{ "%" + filter +"%" };
我现在的理解是:
CONTENT_FILTER_URI
的原因。CONTENT_FILTER_URI
使得信息更加抽象,即更少的SQL特定,更多的Web服务,如数据访问。关于这一点,我仍然感到困惑,为什么sortOrder
也没有在URI 中以某种方式表达。这是一种权衡吗? (我希望官方示例不采用slopy方法,并且确实有理由在内容提供者之外形成select
参数。)
我是否应该始终解析用户输入的过滤器值?原因是用户可以输入任何过滤值 - 也可以插入禁用的字符。这样就可以形成未知的URI路径,并且可能无法识别URI。或者更糟糕的是,可能有可能进行某种SQL注入,或者至少应用程序崩溃。在考虑URI和注入错误时,我是否太偏执了? developer.android.com或其他地方提到的与问题相关的规则或工具是什么?