安卓四大组件之内容提供者

          一. Activity

          二. Service

          三. ContentProvider

          四. BroadCast Receiver

内容提供者

  • 应用的数据库是不允许其他应用访问的
  • 内容提供者的作用就是让别的应用访问到你的数据库
  • 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码。

  • 
    
  • 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址

    <provider android:name="com.itheima.contentprovider.PersonProvider"
        android:authorities="com.itheima.person"
        android:exported="true"
     ></provider>

 

自定义内容提供者

    public class PersonProvider extends ContentProvider {

    private MyOpenHelper oh;
    SQLiteDatabase db;

    //创建uri匹配器对象
    static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
    //检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配
    static {
        um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/person
        um.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacher
        um.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4
    }

    //内容提供者创建时调用
    @Override
    public boolean onCreate() {
        oh = new MyOpenHelper(getContext());
        db = oh.getWritableDatabase();
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        Cursor cursor = null;
        if(um.match(uri) == 1){
            cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);
        }
        else if(um.match(uri) == 2){
            cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
        }
        else if(um.match(uri) == 3){
            //把uri末尾携带的数字取出来
            long id = ContentUris.parseId(uri);
            cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);
        }
        else{
            throw new IllegalArgumentException("uri又有问题哟亲么么哒");
        }
        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        if(um.match(uri) == 1){
            return "vnd.android.cursor.dir/person";
        }
        else if(um.match(uri) == 3){
            return "vnd.android.cursor.item/person";
        }
        return null;
    }

    //此方法供其他应用调用,用于往people数据库里插数据
    //values:由其他应用传入,用于封装要插入的数据
    //uri:内容提供者的主机名,也就是地址
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //使用uri匹配器匹配传入的uri
        if(um.match(uri) == 1){
            db.insert("person", null, values);

            //发送数据改变的通知
            //uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
            getContext().getContentResolver().notifyChange(uri, null);
        }
        else if(um.match(uri) == 2){
            db.insert("teacher", null, values);

            getContext().getContentResolver().notifyChange(uri, null);
        }
        else{
            throw new IllegalArgumentException("uri有问题哟亲么么哒");
        }
        return uri;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int i = db.delete("person", selection, selectionArgs);
        return i;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int i = db.update("person", values, selection, selectionArgs);
        return i;
    }

    }

 

 

访问自定义内容提供者

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        //注册一个内容观察者,监听内容提供者数据的变化,内容提供者数据改变会发送改变通知。
        getContentResolver().registerContentObserver(Uri.parse("content://com.itheima.people"), true, 
        		new ContentObserver(new Handler()) {
        		@Override
        		public void onChange(boolean selfChange) {
        		// TODO Auto-generated method stub
        		super.onChange(selfChange);
        		System.out.println("我的数据改变了哟!");
        		}
	});
    }
    public void insert(View v){
    //通过内容提供者把数据插入people数据库
    //拿到contentResolver
    ContentResolver cr = getContentResolver();
    ContentValues values = new ContentValues();
    values.put("name", "赵帅哥");
    //values.put("money", "13000");
    //url:内容提供者的主机名
    //values:要插入的数据
    cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);

    }

    public void delete(View v){
        ContentResolver cr = getContentResolver();
        int i = cr.delete(Uri.parse("content://com.itheima.people"),
                                                "name = ?", new String[]{"小志"});
        System.out.println(i);
    }
    public void update(View v){
        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", "sb志");
        int i = cr.update(Uri.parse("content://com.itheima.people"),
                                    values, "name = ?", new String[]{"大志"});
        System.out.println(i);
    }

    public void select(View v){
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"),
                                                                        null, null, null, null);
        while(cursor.moveToNext()){
            String name = cursor.getString(1);
            String money = cursor.getString(2);
            System.out.println(name + ";" + money);
        }
    }

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin@1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值