有关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);

 

posted @ 2018-04-15 11:21  醉醉龙  阅读(450)  评论(0编辑  收藏  举报