ContentProvider入门

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时,会回调一次ContentProvider

05-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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值