《2022年ContentProvider实例 .pdf》由会员分享,可在线阅读,更多相关《2022年ContentProvider实例 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在在 Content provider实现中使用 SQLiteOpenHelper 中实现的是特别简单的content provider,方法实现不全。下面给出一个实现比较全面的Content provider ,当然也是很简单的。使用 UriMatcher UriMatcher 可以帮助开发者识别Uri 。比如:content:/com.easymorse.cp.mycp/emperors 表示获取朝代列表集合。而:content:/com.easymorse.cp.mycp/emperors/1 表示其中的 _ID 值为 1 的一个特定的记录。如果自己写分析 Uri 的代码,比较繁琐和重复
2、。android 提供了方便的工具类UriMatcher 。首先定义两个常量,针对集合与特定的单条记录:private static final int ITEMS = 1; private static final int ITEM = 2; 另外要创建 UriMatcher 实例:private static UriMatcher uriMatcher; static uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, TABLE_EMPERORS, ITEMS); uriMa
3、tcher.addURI(PROVIDER_NAME, TABLE_EMPERORS + /#, ITEM); 静态即可。然后在静态初始化块中把ITEMS和 ITEM加进去。这里指定了ITEMS的 URI模式是:content:/com.easymorse.cp.mycp/emperors 而 ITEM是:content:/com.easymorse.cp.mycp/emperors/# #号表示一个 id 值。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 -
4、- - - - - - - - UriMatcher 如何使用呢?uriMatcher.match(uri) 如果一个 content:/com.easymorse.cp.mycp/emperors Uri,该方法将返回 1,也就是常量 ITEMS的值,以此类推。编写一个 getType 方法:Override public String getType(Uri uri) switch (uriMatcher.match(uri) case ITEMS: return vnd.android.cursor.dir/vnd.easymorse.mycp; case ITEM: return vn
5、d.android.cursor.item/vnd.easymorse.mycp; default: throw new IllegalArgumentException(Unsupported URI: + uri); 这个方法在本例中并未起到作用,如果作为intent并使用 data(Mimetype)就会用到这个方法。可见 总结一下 Intent概念的 data 测试部分。编写查询方法查询方法的代码:Override public Cursor query(Uri uri, String projection, String selection, String selectionArgs
6、, String sortOrder) switch (uriMatcher.match(uri) case ITEMS: return database.query(TABLE_EMPERORS, projection, selection, selectionArgs, null, null, sortOrder); case ITEM: return database.query(TABLE_EMPERORS, projection, _ID + = + uri.getPathSegments().get(1), selectionArgs, null, null, null); def
7、ault: throw new IllegalArgumentException(unknown uri: + uri); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 这里有两种可能,通过条件查询,或者通过 id 查询,前者走 ITEMS , 后者走 ITEM ,都是通过 Uri 判断的,借助 UriMatcher 。这里:uri.getPathSegments().get(1), 将取到 id 号。如果 get(0) ,将
8、取到 path 的第一个值 emperors。使用该 Content provider的代码:private String getContentProviderValues() StringBuilder builder = new StringBuilder(); / 查名称和朝代,朝代 =明,而且按照登基时间倒排序 Cursor cursor = managedQuery(MyContentProvider.CONTENT_URI, new String MyContentProvider.NAME, MyContentProvider.DYNASTY , MyContentProvide
9、r.DYNASTY + =?, new String 明 , start_year desc); / 查全部记录 / Cursor cursor = managedQuery(MyContentProvider.CONTENT_URI, null, / null, / null, null); / 根据 id 定位记录( 0.1 ) / Cursor cursor = managedQuery(ContentUris.withAppendedId( / MyContentProvider.CONTENT_URI, 1), / new String MyContentProvider.NAME
10、, null, null, null); while (cursor.moveToNext() builder .append( cursor.getString(cursor .getColumnIndex(MyContentProvider.NAME) .append( | ) / .append( / cursor / .getString(cursor / .getColumnIndex(MyContentProvider.START_YEAR) / .append( | ) .append( cursor.getString(cursor 名师资料总结 - - -精品资料欢迎下载 -
11、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - .getColumnIndex(MyContentProvider.DYNASTY) .append(n); 可以有多种使用方式,本例中屏蔽部分,是其他使用方式。编写编辑方法insert()、update() 和 delete()都属于编辑记录的功能。拿update 举例,因为比较复杂一点:Override public int update(Uri uri, ContentValues contentValues, Str
12、ing selection, String selectionArgs) switch (uriMatcher.match(uri) case ITEM: return database.update(TABLE_EMPERORS, contentValues, _ID + = + uri.getPathSegments().get(1) + and ( + selection + ), selectionArgs); case ITEMS: return database.update(TABLE_EMPERORS, contentValues, selection, selectionAr
13、gs); default: throw new IllegalArgumentException(unknown uri: + uri); 这里复杂的地方是如果根据id 做修改,比如还有其他附加条件, 需要拼接 where子句字符串。后面的and 要带括号,否则逻辑可能不同。使用这个 Content provider的做 update 的示例:ContentValues values = new ContentValues(); values.put(MyContentProvider.NAME, 朱重八 ); getContentResolver().update(MyContentProv
14、ider.CONTENT_URI, values, MyContentProvider.NAME + =?, new String 朱元璋 ); 修改表中是 朱元璋 的,改为他的小名,朱重八。如果是 delete 和 insert操作,情况是类似的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -