一、概念及说明

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 userProjectMap;   static {     userProjectMap = new HashMap();     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中声明

     

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android数据存储方式之:ContentProvider
  4. Android自定义Dialog、Dialog样式、Dialog动画
  5. java的String和android的String有什么区别?
  6. 自定义Logcat,完全控制打印信息
  7. 3.腾讯微博Android客户端开发——算法、编码、辅助方法编写
  8. Android消息传递机制浅析
  9. android AsyncTask相关的一些面试题目

随机推荐

  1. android开源系列:CircleImageView自定义圆
  2. 拍照
  3. android 10 手机无法预览到图片, 加载图
  4. [android]notifyDataSetChanged方法
  5. [置顶] 我的Android进阶之旅------>Andro
  6. Android之防止反编译技巧
  7. Android onRequestPermissionsResult在Fr
  8. android 常用库github网址
  9. Android java.lang.NoClassDefFoundError
  10. Kying文件