1 内容提供者 作用:暴露app开发者想暴露的数据库内容给其他应用开发者(供其他开发者使用)
建立一个数据库:
publicclassMyOpenHelperextends SQLiteOpenHelper{
public MyOpenHelper(Context context) {
super(context, "info.db",null, 1);
}
@Override
publicvoid onCreate(SQLiteDatabase arg0) {
arg0.execSQL("create table info (_id integer primary key autoincrement,name varchar(20)," + "phone varchar(20),number varchar(20))");
}
@Override
publicvoidonUpgrade(SQLiteDatabase arg0,intarg1,int arg2) {
}
}
自定义AccountProviderr继承ContentProvider,其中只实现了query()这个方法:
publicclassAccountProviderrextends ContentProvider{
privateMyOpenHelper myOpenHelper;//自定义的数据库privatestaticfinalintQUERYSUCCESS = 0;//定义的常量用来匹配要进行的操作
// 1 路径匹配器privatestaticfinalUriMatcher sURIMatcher =new UriMatcher(UriMatcher.NO_MATCH);
// 2 静态代码块 添加匹配规则static{
// url http://www.baidu.com// uri: com.zyf.provider/querysURIMatcher.addURI("com.zyf.provider", "query", QUERYSUCCESS);
}
@Override
publicboolean onCreate() {
myOpenHelper=new MyOpenHelper(getContext());
returnfalse;
}
@Override
publicint delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stubreturn0;
}
@Override
public String getType(Uri arg0) {
// TODO Auto-generated method stubreturnnull;
}
@Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stubreturnnull;
}
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {intcode=sURIMatcher.match(uri);
if(code == QUERYSUCCESS) {
SQLiteDatabase db=myOpenHelper.getReadableDatabase();
Cursor cursor = db.query("info",null,null,null,null,null,null);
System.out.println("我是内容提供者的query()");
return cursor;
} else{
returnnull;
}
}
@Override
publicint update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stubreturn0;
}
}
清单文件中的声明:
注意: android:exported="true"这一项
android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。
总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。
在其他应用中使用上边的AccountProviderr:我直接在MainActivity中使用了(简单粗暴实现效果):
这里要注意"content://com.zyf.provider/query"这个字符串一定要和上边自定义的AccountProviderr中的匹配规则相匹配
publicclassMainActivityextends Activity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri=Uri.parse("content://com.zyf.provider/query");
Cursor cursor=getContentResolver().query(uri,null,null,null,null);
if(cursor !=null&& cursor.getCount()>0){
while(cursor.moveToNext()){
String name=cursor.getString(1);
String phone=cursor.getString(2);
System.out.println("-----name"+name+"------"+phone);
}
}
}
}
2 内容观察者就是监视某个数据库数据的改变,然后做出你让它做的行为
1 调用系统的内容观察者就是在数据库发生改变后进行操作,下面是一个insert()方法后的操作
publicvoid insert(String packageName){
SQLiteDatabase db=mAppLockOpenHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("packagename", packageName);
db.insert("applock",null, values);
db.close();
//内容观察者
//这个Uri是自己随意命名的context.getContentResolver().notifyChange(Uri.parse("content://applock/change"),null);
}
在另一个类中调用也很简单
mMyObserver=newMyObserver(new Handler());
getContentResolver().registerContentObserver(Uri.parse("content://applock/change"),true, mMyObserver);