Android ContentProvider的实现及简单实例代码

所属分类: 软件编程 / Android 阅读数: 39
收藏 0 赞 0 分享

一、概念及说明

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实现悬浮窗体效果

这篇文章主要为大家详细介绍了Android实现悬浮窗体效果,显示悬浮窗口,窗口可以拖动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Andriod studio 打包aar 的方法

这篇文章主要介绍了Andriod studio 打包aar的方法,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

Android加载loading对话框的功能及实例代码(不退出沉浸式效果)

这篇文章主要介绍了Android加载loading对话框的功能及实例代码,不退出沉浸式效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中LayoutInflater.inflater()的正确打开方式

这篇文章主要给大家介绍了关于Android中LayoutInflater.inflater()的正确打开方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Delphi在Android下使用Java库的方法

这篇文章主要介绍了Delphi在Android下使用Java库的方法,本文以Android的USB串口通讯库为例,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Retrofit2日志拦截器的使用

这篇文章主要介绍了Retrofit2日志拦截器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android创建外部lib库及自定义View的图文教程

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序失败的一些事小结

这篇文章主要给大家介绍了关于Android分享微信小程序失败一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序技巧之图片优化

这篇文章主要给大家介绍了关于Android分享微信小程序技巧之图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android Viewpager实现无限循环轮播图

这篇文章主要为大家详细介绍了Android Viewpager实现无限循环轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多