ContentProvider

ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。
ContentProvider的就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据。ContentResolver就是按照一定规则访问内容提供者的数据。

ContentProvider对外共享数据步骤:

步骤

1. 定义一个类 继承 ContentProvider
2. 定义匹配规则 uri
3. 通过静态代码块添加匹配规则 
4.在manifest.xml中配置contentProvider.

Uri介绍

uri代表了要操作的数据

上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?

Uri作为唯一的标识来标识这个Provider。

ContentProvider的scheme为:content://
Authority 用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作file表中id为10的记录,可以构建这样的路径:/file/10
要操作file表中id为10的记录的name字段, file/10/name
要操作file表中的所有记录,可以构建这样的路径:/file

当然要操作的数据可以是数据库,也可以是文件、xml或网络等其他存储方式。

代码示例

public class FileProvider  extends ContentProvider {

    private Context mContext;
private static final int QUEYSUCESS = 0;
private static final int INSERTSUCESS = 1;
//UriMatcher.NO_MATCH表示不匹配任何路径的返回码
private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private SQLiteDatabase mDb;
private String mTableName = DbOpenHelper.STUDENT_TABLE_NAME;
static{
//注册所有要匹配的uri
mUriMatcher.addURI("com.itcast.contentp.FileProvider", "query", QUEYSUCESS);
mUriMatcher.addURI("com.itcast.contentp.FileProvider", "insert", INSERTSUCESS);
} //该方法在其它应用第一次访问它时才会被创建
@Override
public boolean onCreate() {
mContext = getContext();
mDb = new DbOpenHelper(mContext).getWritableDatabase();
return false;
} /**
*public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)
*projection : 这个参数告诉查询要返回的列(Column)即需要的字段,比如Contacts Provider提供了联系人的ID和联系人的NAME等内容.
*selection :查询where字句
*selectionArgs : 查询条件属性值
*sortOrder :结果排序
*/
@Override
public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,String arg4) {
if (mUriMatcher.match(uri)== QUEYSUCESS ) {//uri匹配后进行下面的操作
Cursor cursor = mDb.query(tableName, arg1, arg2, arg3, null, null, null);
getContext().getContentResolver().notifyChange(uri, null);
return cursor;
}else{
throw new IllegalArgumentException("match fail");
}
}
这里只给出部分代码。。。。。。

ContentResolver

使用ContentResolver调用ContentProvider提供的接口,对ContentProvider中的数据进行添加、删除、修改和查询操作时。

可以使用Activity提供的getContentResolver()方法来获取ContentResolver对象。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:

  • public Uri insert(Uri uri, ContentValues values)
  • public int delete(Uri uri, String selection, String[] selectionArgs)。
  • public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
  • public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

1.对ContentProvider中的数据进行增删改查

直接看代码:

//uriQuery必须与要查询的ContentProvider中的要操作数据的uri保持一致(btw 这里只给了查询好插入的例子)

ContentValues values = new ContentValues();
Cursor cursor = getContentResolver().query(uriQuery, null, null, null, null);
int count = cursor.getCount(); //获取到一共有多少行
int contact_id = count + 1; ContentValues nameValues = new ContentValues();
nameValues.put("name", name);
nameValues.put("mime_type", "vnd.android.cursor.item/name");
nameValues.put("contact_id", contact_id);
getContentResolver().insert(uriInsert, nameValues);

2.监听ContentProvider中数据的变化

在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者。

当数据放生变化时会调用ContentObserver的onChange()来进行一系列的后续操作~~~

如下:

public class MainActivity extends Activity {

    private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //注册
uri = Uri.parse("content://com.example.contentp.AccountProvider");
        getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler())) 
}
}

//监听到变化后调用onChange()来执行一系列操作

private class MyObserver extends ContentObserver {
Uri uri = Uri.parse("content://com.example.contentp.AccountProvider"); public MyObserver(Handler handler) { super(handler);
}
@Override
public void onChange(boolean selfChange) {
Cursor cursor = getContentResolver().query(uri, new String[]{"file","mime_type","date"}, null, null, null);
while(cursor.moveToNext()){
//执行一些操作
}
}
}

ContentProviderClient

与ContentResolver一样都是用来对ContentProvider中的数据进行添加、删除、修改和查询操作的

通过调用 getContentResolver().acquireContentProviderClient(authority) 方法获取 ContentProviderClient对象。

用法跟ContentResolver相似,不同点是ContentProviderClient 对象必须在结束使用后,调用ContentProviderClient.release()来释放。这会是系统释放对应的ContentProvider对象。

对于相同ContentProvider 的多次调用,推荐使用ContentProviderClient。

ContentProvider和ContentResolver的使用的更多相关文章

  1. ContentProvider、ContentResolver、ContentObserver之间的关系

    ContentProvider.ContentResolver.ContentObserver之间的关系 ContentPRrovider: * 四大组件的内容提供者,主要用于对外提供数据 * 实现各 ...

  2. Android ContentProvider、ContentResolver和ContentObserver的使用

    1.ContentProvider.ContentResolver和ContentObserver ContentProvider是Android的四大组件之中的一个,可见它在Android中的作用非 ...

  3. ContentProvider 、 ContentResolver 、 ContentObserver

    说说ContentProvider . ContentResolver . ContentObserver 之间的关系**a. ContentProvider 内容提供者,用于对外提供数据 b. Co ...

  4. android 多应用程序数据共享 ContentProvider和ContentResolver

      android 没有一个可以将所有应用程序数据统一放置的地方,即两个应用程序间的数据不能共享.但ContentProvider与ContentResolver可以解决多应用程序数据共享. 我们都知 ...

  5. ContentProvider,ContentResolver和ContentObserver 使用

    1 ContentProvider内容提供者 四大组件之一,实现不同程序实现数据的共享.联系人应用就使用了ContentProvider,比如你在自己的应用可以读取和修改联系人的数据(获得相应权限). ...

  6. ContentProvider与ContentResolver使用【转】

    这篇文章被转载而转载者未注明原文出处,在此未加上原文地址链接,本人向原作者致以歉意. 下面是文章内容: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写 ...

  7. ContentProvider与ContentResolver使用

    例如以下内容为从网络转载: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其它应用共享其数据.虽然使用其它方 ...

  8. ContentProvider与ContentResolver

    使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据 ...

  9. ContentProvider官方教程(2)简介、Content URIs

    In this document Overview Accessing a provider Content URIs Content Provider Basics A content provid ...

随机推荐

  1. bugku login2 writeup 不使用vps的方法

    0x00前言 这个题是sql注入与命令执行相结合的一个题,思路有两个: 一.:sql注入登录web系统,命令执行反弹公网IP监听端口(需要vps),此种方法详见链接:http://www.bugku. ...

  2. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  3. 微信小程序开发资源汇总 💯

    目录 官方文档 工具 插件 讨论 教程 视频教程 文章 代码 轮子 置顶 WePY:组件化的小程序开发框架 

  4. activiti工作流框架简介

    常见的工作流框架:activiti, JBPM, OSWorkflow activiti框架基于23张基础的表数据, 基于Mybatis操作数据库. JBPM框架基于18张基础的表数据, 基于hibe ...

  5. Tiny4412之外部中断

    一:外部中断 在之前我们学习按键驱动的时候,我们检测按键有没有按下是通过轮循的方式(也就是我们说的死循环),这样虽然可以检测实现按键,但太浪费系统资源了,不论我们按键中断有没有发生,cpu都要一直进行 ...

  6. servlet文件上传及下载

    servlet3.0中提供了对文件上传的直接支持,不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能. servlet 代码: package ni.jun. ...

  7. 建立CMenu菜单项,实现选中菜单项点击左键响应事件

    这里我只是根据自己的项目做了一些总结,实现点击右键弹出菜单项,点左键选择菜单项: CMenu menu; VERIFY(menu.CreatePopupMenu());//新建一个cmenu菜单项 m ...

  8. 【BZOJ4417】: [Shoi2013]超级跳马

    题目链接: 传送. 题解: 矩阵快速幂优化DP. 先考虑$nm^2$DP,设$f_{(i,j)}$表示从$1,1$到$i,j$的方案,显然这个方程和奇偶性有关,我们考虑某列的$i$同奇偶性的转移和奇偶 ...

  9. bzoj3199 [Sdoi2013]escape

    这题真tm是醉了. 就是对于每个亲戚,利用其它的亲戚对他半平面交求出其控制的范围,然后随便跑个最短路就行了 n=0卡了我一下午////// #include <cstdio> #inclu ...

  10. BZOJ_4004_[JLOI2015]装备购买_线性基

    BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...