您的位置:首页 > 编程语言 > PHP开发

ContentProvider入门

2016-05-18 17:00 627 查看

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: