ContentProvider入门

来源:互联网 发布:cdr软件手机版 编辑:程序博客网 时间:2024/05/22 14:00

ContentProvider简介

多进程的程序之间进行互相通信时,使用ContentProvider可以实现数据的共享,ContentProvider提供的数据可以来自文件,数据库等,通过URI与调用者进行关联.

从这点上看,ContentProvider使应用像一个网站,URI即域名。:-)

这里写图片描述

在ManiFest文件 中进行声明

<!-- antuorities属性表明当期ContentProvider的URI地址 -->        <provider android:name=".MyProvider"            android:authorities="com.terry.mycontentprovider"            android:exported="true">        </provider>

简单的Provider

public class MyProvider extends ContentProvider{    @Override    public int delete(Uri arg0, String arg1, String[] arg2) {        Log.v("LOG","ContentProvider -- delete()");        return 0;    }    // 获取MIIE类型    @Override    public String getType(Uri arg0) {        return null;    }    @Override    public Uri insert(Uri arg0, ContentValues arg1) {        Log.v("LOG","ContentProvider -- insert()");        return null;    }    @Override    public boolean onCreate() {        Log.v("LOG", "ContentProvider -- onCreate()");        return false;    }    @Override    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,            String arg4) {        Log.v("LOG","ContentProvider -- query()");        return null;    }    @Override    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {        Log.v("LOG", "ContentProvider --update()");        return 0;    }}

ContentProvider 的生命周期

ContentProvider 只用一个生命周期,就是onCreate()
当其他应用第一次访问该ContentProvider时,onCreate()方法会被调用一次.

URI

标示ContentProvider的位置,格式如下
这里写图片描述
实际上,为了能确定ContentProvider实际能处理的Uri,以及确定每个URI参数中所操作数据,需要使用UriMatcher

ContentResolver

通过Context的getContentResolver()获取该对象,然后对该 对象的操作,实际上是操作的Uri对应的ContentProvider对象

这是另一个APP的界面,用于使用ContentResolver调用ContentProvider

布局很简单,上面有四个Button对应CRUD四个操作,现在只用前两个为例

public class MainActivity extends ActionBarActivity {    private ContentResolver mResolver;    // 获取URI对象,与上面的保持一致    private static Uri URI = Uri.parse("content://com.terry.mycontentprovider");    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mResolver = getContentResolver();    }    public void query(View v) {        Log.v("LOG", "ContentResolver -- query()");        mResolver.query(URI, null, null, null, null);    }    public void insert(View v) {        Log.v("LOG", "ContentResolver -- insert()");        ContentValues c = new ContentValues();        c.put("Key", "Value");        mResolver.insert(URI, c);    }}

好了,看下Log的顺序吧。

05-18 04:59:17.413: V/LOG(4599): ContentResolver -- query()// 在第一次使用ContentProvider时,会回调一次ContentProvider05-18 04:59:17.576: V/LOG(4621): ContentProvider -- onCreate()05-18 04:59:17.582: V/LOG(4621): ContentProvider -- query()05-18 04:59:21.541: V/LOG(4599): ContentResolver -- insert()05-18 04:59:21.565: V/LOG(4621): ContentProvider -- insert()
0 0
原创粉丝点击