第一步:在AndroidManifest.xml中添加
<provider android:name=".MyContentProvider" android:authorities="cn.edu.mytest"></provider>
第二步:继承ContentProvider
package cn.edu.database;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyContentProvider extends ContentProvider{
private MySqliteHelper helper;
private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH);//Uri不匹配码,不匹配返回-1
private static final int PERSONS=1;
private static final int PERSON=5;
static { //类加载的时候执行,一般用来初始化静态变量
MATCHER.addURI("cn.edu.mytest", "person", PERSONS);//如果匹配这个Uri(content://cn.edu.test/person),返回PERSONS
MATCHER.addURI("cn.edu.mytest", "person/#", PERSON);
}
public MyContentProvider()
{
helper=new MySqliteHelper(this.getContext(),"test.db",null,1);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db=helper.getWritableDatabase();
int num=0;
switch(MATCHER.match(uri)){
case PERSONS:
num=db.delete("product", selection, selectionArgs);
return num;
case PERSON:
long rowid=ContentUris.parseId(uri);
String where ="id="+rowid;
num=db.delete("product", where, selectionArgs);
return num;
default:
throw new IllegalArgumentException("this is unknown uri:"+uri);
}
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
switch(MATCHER.match(uri)){
case PERSONS:
return "vnd.android.cursor.dir/person";//返回是集合类型就是dir
case PERSON:
return "vnd.android.cursor.item/person";
default:
throw new IllegalArgumentException("this is unknown uri:"+uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db=helper.getWritableDatabase();
switch(MATCHER.match(uri)){
case PERSONS:
long rowid=db.insert("product", "name", values);//如果主键值是整形却增加,那么rowid就是主键值
Uri insertUri=ContentUris.withAppendedId(uri, rowid);
this.getContext().getContentResolver().notifyChange(uri, null);//发错数据变化通知
return insertUri;
default:
throw new IllegalArgumentException("this is unknown uri:"+uri);
}
}
@Override
public boolean onCreate() {//该方法由操作系统调用,当内容提供者的实例被创建出来以后调用,只会被调用一次
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
第三步:在其他的应用中访问ContentProvider
public void accessContentProvider()//该方法可以在其他应用程序中调用
{
Uri uri=Uri.parse("content://cn.edu.mytest/person");
ContentResolver reslover=this.getContext().getContentResolver();
ContentValues values=new ContentValues();
values.put("name","zhangsan");
values.put("time", "2012");
reslover.insert(uri, values);//会调用ContentProvider中的insert()
}
public void accessContentProviderDelete()//该方法可以在其他应用程序中调用
{
Uri uri=Uri.parse("content://cn.edu.mytest/person/1");
ContentResolver reslover=this.getContext().getContentResolver();
reslover.delete(uri,null,null);
}
CotentProvider:可以把应用中的xml/txt/db/数据对外共享
使用ContentProvider可以统一数据的访问方式
写一个PersonProvider类继承ContentProvider
在配置清单中添加配置信息
<provider android:name=".PersonProvider"
android:authorities="cn.edu.personprovide(标志)>
Uri代表了要操作的数据,Uri主要包含了两部分信息:1、需要操作的ContentProvider,
2、对ContentProvider中的什么数据进行操作
括号代表注释
content:(这个是schema)//cn.edu.personprovide(要操作的主机名或者
authority)/person/10(person/1是路径,1是ID)
ContentProvider的schema已经由Android所规定,schema为:content//主机名(或叫
Authority)用于唯一标志这个Contentprovider,外部调用者可以根据这个标志来找到
它,路径可以用来表示我们要操作的数据,路径构建应根据业务而定
监听ContentProvider中数据的变化
A应用向ContentProvider中添加了一条数据
ContentProvidr发出数据变化通知B应用
在继承ContentProvider的类得inset方法中添加
this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变
化通知
B应用要处于运行状态
在B应用的Activity的中onCreate方法中
this.getContentResolver().registerContentObserver(Uri,true,new
PersonContent());
private class PersonContentObserver extedns ContentObserver{
在onChange方法中()
{
Uri uri=Uri.prase("content://cn.edu.test/product");
getContentResolver.qeruy(uri,null,null,"personid desc limit 1");
}
}