摘要:就是按照一定规则访问内容提供者的数据。使用调用提供的接口,对中的数据进行添加删除修改和查询操作时。类提供了与类相同签名的四个方法。用法跟相似,不同点是对象必须在结束使用后,调用来释放。这会是系统释放对应的对象。对于相同的多次调用,推荐使用。
ContentProvider
ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。
ContentProvider的就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据。ContentResolver就是按照一定规则访问内容提供者的数据。
ContentProvider对外共享数据步骤:
步骤
1. 定义一个类 继承 ContentProvider
2. 定义匹配规则 uri
3. 通过静态代码块添加匹配规则
4.在manifest.xml中配置contentProvider.
Uri介绍
uri代表了要操作的数据
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; } @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类相同签名的四个方法:
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.itcast.contentp.AccountProvider");
getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler()))
}
}
//监听到变化后调用onChange()来执行一系列操作
private class MyObserver extends ContentObserver { Uri uri = Uri.parse("content://com.itcast.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。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/2465.html
摘要:前言属于的四大组件之一本文全面解析了,包括原理使用方法实例讲解,希望你们会喜欢。 前言 ContentProvider属于 Android的四大组件之一 本文全面解析了 ContentProvider ,包括ContentProvider 原理、使用方法 & 实例讲解,希望你们会喜欢。 目录 showImg(https://segmentfault.com/img/remote/...
摘要:前言属于的四大组件之一本文全面解析了,包括原理使用方法实例讲解,希望你们会喜欢。 前言 ContentProvider属于 Android的四大组件之一 本文全面解析了 ContentProvider ,包括ContentProvider 原理、使用方法 & 实例讲解,希望你们会喜欢。 目录 showImg(https://segmentfault.com/img/remote/...
摘要:原文来自所谓的四大组件一次是和。它的主要作用时当某个时刻向其他和进行广播,让监听这个广播的组件根据广播内容进行相关的操作。为了暴露自己的数据需要提供以下几个方法。 原文来自http://www.jianshu.com/p/478a34af17df 所谓的android四大组件一次是Activity、Service、BroadcastReceiver和ContentProvider。 A...
摘要:获取短信内容的方法短信内容数据也是系统提供的,获取方法如下获取方法如下微信公众号程序员插入数据测试数据中。。。。。 showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); 极力推荐文章:欢迎收藏Android 干货分享 showImg(https://segmentfault.com/img/...
摘要:方法中又调用了方法方法中调用了的方法,是类型的,从类型名字就可以看出来是用于进程间通信,这里实现方法的是类,它实现了接口。前言 Content Provider做为四大组件之一,通常情况下并没有其他的组件使用频繁,但这不能作为我们不去深入学习它的理由。关于Content Provider一篇文章是写不完的,这一篇文章先来介绍它的启动过程。 1.query方法到AMS的调用过程 在Androi...
阅读 1207·2021-10-08 10:04
阅读 572·2021-09-07 09:58
阅读 2732·2019-08-30 15:55
阅读 2274·2019-08-29 17:21
阅读 2005·2019-08-28 18:04
阅读 2950·2019-08-28 17:57
阅读 579·2019-08-26 11:46
阅读 2085·2019-08-23 17:20