• 有关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);
  • 相关阅读:
    第一阶段:前端开发_使用JS完成注册页面表单校验完善
    第一阶段:前端开发_使用 JS 完成页面定时弹出广告
    第一阶段:前端开发_使用JS完成首页轮播图效果
    第一阶段:前端开发_使用JS完成注册页面表单校验
    三、Java基础工具(1)_常用类——日期类
    使MySQL支持emoji
    1. Two Sum [Array] [Easy]
    『IOS』 遇到问题记录(长期更新)
    [IOS] 详解图片局部拉伸 + 实现图片局部收缩
    【IOS】模仿"抽屉新热榜"动态启动页YFSplashScreen
  • 原文地址:https://www.cnblogs.com/zzl521/p/8846520.html
Copyright © 2020-2023  润新知