美文网首页
有关ContentProvider及相关一系列的简单用法

有关ContentProvider及相关一系列的简单用法

作者: longmingren123 | 来源:发表于2019-07-31 14:15 被阅读0次

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

    相关文章

      网友评论

          本文标题:有关ContentProvider及相关一系列的简单用法

          本文链接:https://www.haomeiwen.com/subject/rwazrctx.html