Android ContentProvider的实现及简单实例代码
一、概念及说明
ContentProvider定义:
内容提供者是一个Android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个ContentResolver接口,使用ContentProvider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了ContentProvider(视频、音频),ContentProvider使用表的形式来组织数据。
URI定义:
每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。android所提供ContentProvider都存放在android.provider。
二、实现ContentProvider的过程
1。定义ContentProvider所需要的常量(最主要的是定义CONTENT_URI,CONTENT_URI是Uri类型,事实是通过字符串解析得到)
//定义ContentProvider所需要的常量 public class FirstProviderMetaData { // AUTHORIY等于自己的创建ContentProvider类的完全路径 public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; // 数据库的名称 public static final String DATABASE_NAME = "FirstProvider.db"; // BaseColumns有两个字段_id和_count public static final class UserTableMetaData implements BaseColumns { // 表名 public static final String TABLE_NAME = "t_user"; // 访问该ContentProvider的URI public static final Uri CONTENT_URI = Uri .parse("content://" + AUTHORIY); // 表的数据类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; // 一列的数据类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; // 一个字段 public static final String USER_NAME = "name"; // 默认排序 public static final String DEFAULT_SORT_ORDER = "_id desc"; } }
2。定义一个类,继承ContentProvider
3。实现query,insert,update,delete,getType和onCreate方法
(1).定义UriMatcher
// 匹配Uri,检查Uri的合法性 public static final UriMatcher uriMatcher; public static final int INCOMING_USER_COLLECTION = 1; public static final int INCOMING_USER_SIGNLE = 2; static { // 创建一个uri树的根结点 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 添加uri匹配对,如果这个匹配成功,则code值则会返回。 uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user", INCOMING_USER_COLLECTION); uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#", INCOMING_USER_SIGNLE); }
(2).重写getType方法
// 根据传入uri,所回该uri所表示的数据类型 @Override public String getType(Uri uri) { // TODO Auto-generated method stub switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: return UserTableMetaData.CONTENT_TYPE; case INCOMING_USER_SIGNLE: return UserTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + uri); } }
(3).创建userProjectMap哈希Map静态对象
public static HashMap<String, String> userProjectMap; static { userProjectMap = new HashMap<String, String>(); userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID); userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME); }
(4).重写insert方法
// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub SQLiteDatabase db = dbHelper.getWritableDatabase(); // rowId是新插入数据的id long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); // 正常插入,-1为出常错误 if (rowId != -1) { // 添加一个id到这个路径的结尾 Uri insertUserUri = ContentUris.withAppendedId( UserTableMetaData.CONTENT_URI, rowId); // 得到一个ContentResolver实例. ContentResolver cr = this.getContext().getContentResolver(); // 通辞呈数据改变 cr.notifyChange(insertUserUri, null); return insertUserUri; } else { throw new SQLException("Failed to insert row into" + uri); } }
(5).重写query方法
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); break; case INCOMING_USER_SIGNLE: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); String idKey = UserTableMetaData._ID; // 1得到path集合 // 2取它的集合的第2个元素 // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id, // content://为协议 // com.example.firstconent.FirstContentProvider为authoriy // /t_user/id为path String idValue = uri.getPathSegments().get(1); sqb.appendWhere(idKey + "=" + idValue); break; } String orderBy = null; if (TextUtils.isEmpty(sortOrder)) { orderBy = UserTableMetaData.DEFAULT_SORT_ORDER; } else { orderBy = sortOrder; } SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = sqb.query(db, projection, selection, selectionArgs, null, null, orderBy); ContentResolver cr = this.getContext().getContentResolver(); // 通适数据变动 cursor.setNotificationUri(cr, uri); return cursor; }
4。在AndroidManifest.xml中声明
<provider android:name="com.example.firstcontent.FirstContentProvider" android:authorities="com.example.first.firstcontent.FirstContentProvider" > </provider>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- 实例讲解Android中ContentProvider组件的使用方法
- Android应用中使用ContentProvider扫描本地图片并显示
- Android中自定义ContentProvider实例
- Android开发之ContentProvider的使用详解
- Android 自定义ContentProvider简单实例
- Android数据持久化之ContentProvider机制详解
- Android开发教程之ContentProvider数据存储
- android基础总结篇之八:创建及调用自己的ContentProvider
- Android学习笔记之ContentProvider和Uri详解
- 详解Android ContentProvider的基本原理和使用
相关文章
RecylerView实现流布局StaggeredGridLayoutManager使用详解
这篇文章主要为大家详细介绍了RecylerView实现流布局StaggeredGridLayoutManager使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-09-09Android RecycleView使用(CheckBox全选、反选、单选)
这篇文章主要为大家详细介绍了Android RecycleView使用,CheckBox全选、反选、单选效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-09-09Android使用友盟集成QQ、微信、微博等第三方分享与登录方法详解
之前的项目第三方分享和登录一直都使用ShareSDK实现的。为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟,这里为大家整理出详细方法2018-03-03
最新评论