有关ContentProvider及相关一系列的简单用法(持续添加)
1 内容提供者 作用:暴露app开发者想暴露的数据库内容给其他应用开发者(供其他开发者使用)
建立一个数据库:
public class MyOpenHelper extends SQLiteOpenHelper{ public MyOpenHelper(Context context) { super(context, "info.db", null, 1); } @Override public void onCreate(SQLiteDatabase arg0) { arg0.execSQL("create table info (_id integer primary key autoincrement,name varchar(20)," + "phone varchar(20),number varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } }
自定义AccountProviderr继承ContentProvider,其中只实现了query()这个方法:
public class AccountProviderr extends ContentProvider{ private MyOpenHelper myOpenHelper; //自定义的数据库 private static final int QUERYSUCCESS = 0; //定义的常量用来匹配要进行的操作 // 1 路径匹配器 private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 2 静态代码块 添加匹配规则 static{ // url http://www.baidu.com // uri: com.zyf.provider/query sURIMatcher.addURI("com.zyf.provider", "query", QUERYSUCCESS); } @Override public boolean onCreate() { myOpenHelper=new MyOpenHelper(getContext()); return false; } @Override public int delete(Uri arg0, String arg1, String[] arg2) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri arg0) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri arg0, ContentValues arg1) { // TODO Auto-generated method stub return null; } public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code=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{ return null; } } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { // TODO Auto-generated method stub return 0; } }
清单文件中的声明:
注意: android:exported="true"这一项
android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。
总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。
<provider android:name="com.example.day09_pracontentprovider.AccountProviderr" android:authorities="com.zyf.provider" android:exported="true"> </provider>
在其他应用中使用上边的AccountProviderr:我直接在MainActivity中使用了(简单粗暴实现效果):
这里要注意"content://com.zyf.provider/query"这个字符串一定要和上边自定义的AccountProviderr中的匹配规则相匹配
public class MainActivity extends Activity { @Override protected void 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()方法后的操作
public void 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=new MyObserver(new Handler()); getContentResolver().registerContentObserver(Uri.parse("content://applock/change"), true, mMyObserver);