Android:内容提供者(ContentProvider)和内容访问者(ContentResolver)
来源:互联网 发布:淘宝主图促销水印 编辑:程序博客网 时间:2024/06/06 01:26
ContentProvider(内容提供者)是Android四大基本组件之一。用来共享应用程序内的数据;当你需要把你应用程序的数据提供给其他应用程序时需要用到它;内容访问者(ContentResolver)通过应用程序来访问内容提供者(ContentProvider)的方法,一旦通过ContentProvider提供自己的数据,不管应用程序是否启动,都可以访问得到。
(1)、ContentProvider的原理:按照一定规则暴露自己的接口给其他应用程序来访问自己应用程序的数据(其实就是自定义增删改查接口并提供出去,让其他应用程序访问自己的数据)。
(2)、ContentResolver的原理:按照一点规则访问ContentProvider的数据(其实就是调用ContentProvider自定义的接口来操作它的数据)。
1、首先我们新建一个demo,通过创建自己的ContentProvider来实现应用程序之间的数据共享。新建一个类(MyProvider.java)继承ContentProvider,重写它的6个方法。代码如下:
public class MyProvider extends ContentProvider{ private SQLiteDatabase sqLiteDatabase; @Override public boolean onCreate() { DBhelper dBhelper=new DBhelper(getContext(), "question.db",null,1); sqLiteDatabase = dBhelper.getReadableDatabase(); Log.i("test", "onCreate: 1"); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //查询所有的数据 Log.i("test", "query: 2"); return sqLiteDatabase.rawQuery("select * from questions",null); } @Nullable @Override public String getType(Uri uri) { Log.i("test", "getType: 3"); return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { Log.i("test", "insert: 4"); return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.i("test", "delete: 5"); return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.i("test", "update: 6"); return 0; }}
2、在清单文件(AndroidManifest.xml)中配置ContentProvider。代码如下:
<!--配置内容提供者--> <provider android:authorities="com.example.administrator.android_contentprovider.person" android:name="com.example.administrator.provider.MyProvider" android:exported="true" > </provider>
4、创建ContentResolver的demo来访问ContentProvider的数据。在demo中的布局文件中写一个Button控件,在主activity(MainActivity.java)中写它访问数据的方法。代码如下:public class MainActivity extends AppCompatActivity { private ContentResolver contentResolver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取内容访问者 contentResolver = getContentResolver(); } //按钮点击事件 public void getData(View view){ Uri uri = Uri.parse("content://com.example.administrator.android_contentprovider.person"); Cursor cursor= contentResolver.query(uri,null,null,null,null); while(cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("_id")); String title=cursor.getString(cursor.getColumnIndex("content")); Log.i("test",id+ "getData: "+title+" "); } }}
然后在控制台下会打印你访问的所有数据。
ContentProvider类主要方法的作用:
1>public boolean onCreate()--该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。
2>public Uri insert(Uri uri, ContentValues values)--
该方法用于供外部应用往ContentProvider添加数据。
3>public int delete(Uri uri, String selection, String[] selectionArgs)--
该方法用于供外部应用从ContentProvider删除数据。
4>public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)--
该方法用于供外部应用更新ContentProvider中的数据。
5>public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)--
该方法用于供外部应用从ContentProvider中获取数据。
6>public String getType(Uri uri)--
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,
例如:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。
Uri代表了要操作的数据,Uri主要包含了两部分信息:
1>需要操作的数据路径ContentProvider ,
2>对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://。
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")。
- Android----ContentProvider(内容提供者) ContentResolver(内容访问者)
- ContentProvider内容提供者 和 ContentResolver内容访问者
- ContentProvider内容提供者和ContentResolver内容访问者
- ContentProvider内容提供者和ContentResolver内容访问者
- ContentProvider内容提供者和ContentResolver内容访问者
- Android 中ContentProvider内容提供者和ContentResolver内容访问者
- Android:内容提供者(ContentProvider)和内容访问者(ContentResolver)
- Android ContentProvider(内容提供者 )+ContentResolver(内容访问者)
- Android之ContentProvider(内容的提供者)与ContentResolver(内容访问者)
- ContentProvider内容提供者与ContentResolver内容访问者
- ContentProvider内容提供者与ContentResolver内容访问者
- ContentProvider内容提供者与ContentResolver内容访问者
- ContentProvider(内容提供者)与ContentResolver(内容访问者)
- 内容提供者 ContentProvider 内容访问者 ContentResolver 框架搭建
- ContentProvider内容提供者与ContentResolver内容访问者(二)
- 25.ContentProvider自定义内容提供者与ContentResolver内容访问者
- android的与ContentResolver(内容访问者)对ContentProvider(内容提供者)的增删查改
- Android ContentProvider(内容提供者{模拟底层})和Contentresolver(内容接受者{实现对ContentProvider数据的修改})
- 自定义checkbox选择框的样式
- java整型类型
- PHP开发规范集成工具安装配置
- 解惑:cPanel和WHM有什么区别?
- java集合学习总结
- Android:内容提供者(ContentProvider)和内容访问者(ContentResolver)
- 剑指:旋转数组的最小数字
- ReentrantLock实现原理
- Java并发编程:volatile关键字解析
- 树蛙
- Android recovery UI实现分析
- 接口对接手册(检索篇)
- struts2.0的常用标签
- 整数划分问题(递归法)