一,ContentProvider介绍

ContentProvider内容提供者,是androidAPP四大组件之一。是一种数据存贮访问通道,在你无需了解存储细节的时候就可以方便的访问数据。为什么会有这样的机制呢?在android中没有提供一个公共区域供不同的程序共享访问。我们知道android系统是基于Linux系统的,我们的每一个程序都有独立的账户,拥有独立的虚拟机。我们的android提供了SQLite数据库作为数据存储,但是只能够程序本身访问,试想一下如果我们要写一段发短信的程序,这个时候我们需要访问通讯录存储的联系人那么我们应该怎么办呢?这个时候就可以使用ContentProvider的机制来实现。另外,ContentProvider在系统启动的时候就会自动实例化,无需等待被调用的程序启动我们就可以访问它的数据。

这就是ContentProvider所设计的作用。ContentProvider可以帮助我们安全的实现进程间数据的访问,也是唯一的进程间数据访问的方式(注意和IPC进程间通讯区分,这里的数据主要是指磁盘数据)。

1,实现原理示意图

2,返回的数据模型示意图,返回一个Cursor对象,就是下面的表。

二,如何使用

1,uri解释

第一部分content://固定的标示

第二部分com.lijp.provider.*/在mainfest文件中配置的路径,相当于数据库的路径

第三部分,person相当于访问数据库的表明

第四部分,相当于表的id

2,自定义一个类,继承自系统的ContentProvider

package com.example.cdy.myapplication;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.widget.Toast;/** * Created by cdy on 2015/12/13. * 定义自己的ContentProvider * 1,继承系统的ContentProvider类 * 2,实现父类的方法 */public class MyContentProvider extends ContentProvider {    public boolean onCreate() {        return false;    }    /*    *查询方法,返回一个Cursor对象,    * uri:在manifest文件中注册的地址。 android:authorities="com.example.cdy"    * projection:一组查询的列名    * selection: 查询的条件    * selectionArgs:查询的条件参数    * sortOrder:排序    * */    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        Toast.makeText(getContext(),"打印结果",Toast.LENGTH_LONG).show();        return null;    }    /*    * 返回指定uri的数据类型    * */    public String getType(Uri uri) {        return null;    }    /*    *插入指定uri的数据    * values:插入的数据    * */    public Uri insert(Uri uri, ContentValues values) {        return null;    }    /*    * 删除指定uri的数据    * selection:删除的条件    * selectionArgs:删除的条件参数    * */    public int delete(Uri uri, String selection, String[] selectionArgs) {        return 0;    }   /*   * 更新指定uri的数据   * values:需要更新的数据   * selection:更新的条件   * selectionArgs:更新的条件参数   * */    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        return 0;    }}
3,在mainfest.xml中注册

 <!--在Manifest中注册定义的ContentProvider            authorities:提供访问的地址            name:定义的类名的项目地址,<package>.<class.name>我这里开发使用的android studio自动识别-->        <provider            android:authorities="com.example.cdy"            android:name=".MyContentProvider">        </provider>
4,使用系统提供的ContentResolver调用定义的provider

   button = (Button)findViewById(R.id.test_provider);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                /*                * 系统提供了resolver,供我们调用provider                * */                ContentResolver resolver = getContentResolver();                Cursor cursor = resolver.query(Uri.parse("content://com.example.cdy"),null,null,null,null);            }        });
5,界面输出了定义的MyContentProvider中Query方法中提示的语句。

更多相关文章

  1. 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
  2. android webview 访问https页面 SslError 处理
  3. 写在学习Oracle之前
  4. Android——组件之ContentProvider
  5. Android中的Content Provider
  6. Android(安卓)网络图片异步加载实例
  7. Android(安卓)录音数据传输
  8. Android(安卓)Handler机制之ThreadLocal
  9. 慕课网:Android异步加载AsyncTask项目实战上

随机推荐

  1. Android常用控件以及用法
  2. android中的分享功能
  3. 国内中文Android开发者社区和论坛
  4. 三,android编码规范 & 常用布局 & 常用控
  5. ARCVM:Chrome OS 中运行 Android 应用程序
  6. Android(安卓)65K问题之65K来源探究
  7. Android 应用的自动升级、更新模块的实现
  8. android集成语音功能
  9. 通过Android Studio查看SDK源码
  10. 转帖并消化:Android中一种使用AttributeS