自己实现第一个ContentProvider
来源:互联网 发布:安卓源码分享 编辑:程序博客网 时间:2024/06/05 10:47
一、概念及说明
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和_countpublic static final class UserTableMetaData implements BaseColumns {// 表名public static final String TABLE_NAME = "t_user";// 访问该ContentProvider的URIpublic 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所表示的数据类型@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubswitch (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表示的刚刚使用这个方法所插入的数据@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSQLiteDatabase db = dbHelper.getWritableDatabase();// rowId是新插入数据的idlong 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方法
@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteQueryBuilder 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为pathString 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>
- 自己实现第一个ContentProvider
- Android中ContentProvider的实现及定义自己的ContentProvider
- Android中ContentProvider的实现及定义自己的ContentProvider
- Android的ContentProvider之二 实现自己的ContentProvider
- 初学Android,自己实现ContentProvider(五十五)
- Android开发之实现自己的ContentProvider
- 自己的第一个Blog
- 纪念自己第一个ubuntu
- 自己的第一个博客
- 写给自己-第一个目标
- 自己的第一个html
- 自己的第一个博客
- 实现第一个servlet
- 我自己写的第一个游戏--贪吃蛇(c语言实现)
- 我自己写的第一个游戏--贪吃蛇(windows下c语言实现)
- UIWebView 初学者快速入门(实现自己的第一个网页)3
- unity3d,制作自己的第一个射击游戏demo,实现镜头跟随和键盘控制移动
- u3d做自己的第一个射击游戏demo,实现开火效果和跟随鼠标朝向
- 当你对未来迷茫的时候请看看
- 堆及其算法
- CommandArgument传两个以上参数
- 算法面试题举例
- Django新手需要注意的10个要点
- 自己实现第一个ContentProvider
- 1月20日同学聚会感悟
- 数据库授权方法
- tar 解压缩命令
- 如何成为一名优秀的web前端工程师
- 2月20日同学聚会感悟
- oracle创建表空间用户
- 2013/03/29 腾讯马拉松复试第2题源码。
- 2月控制软件设计灵感