ContentProvider 的创建以及增删改查操作(你想看的都在这里了)

本文详细介绍了Android中ContentProvider的创建过程,并深入探讨了如何进行数据的查询、添加、删除和修改操作,帮助开发者全面掌握ContentProvider的使用。
摘要由CSDN通过智能技术生成

一、创建

新建:新建一个继承自ContentProvider的类
重写:重写6个方法,分别是create(),insert(),delete(),update(),query(),getType()
注册:需要在Manifest中注册provider。这样当外部程序访问本程序数据时,可以精确知道用的是哪个provider
            
 <provider
            android:authorities="com.example.administrator.sqliteexecsql.provider"
            android:name="com.example.administrator.sqliteexecsql.DBProvider"
            android:exported="true"/>
name 是继承自ContentProvider的类名
authorities 是自己起的一个名字,作为外部程序使用ContentProvider的识别.格式最好写com.example.provider
exported 设置为true表示允许外部程序使用provider,设为false则外部程序不能使用
调用:ContentResolver resolver = getContentResolver();之后根据设置的uri来具体调用ContentProvider中的方法
URI: content://com.example.provider/person/10
        content:// ----->固定写法
        com.example.provider即是你在清单文件中注册provider时的authorities
       person-------->path
        10-------------->pweson id

二、查(从比较难的查开始,其他的增删改则不在话下了)

//查询方法,需要传入uri,可以传入列名,查询条件,Where后面占位符的值,以及排序方式
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db =myHelper.getReadableDatabase();
       /* Cursor c = db.query("person",null,null,null,null,null,null); 查询所有,所有列,无条件,无排序方式等。
       如果那边在调用Cursor query()方法时,需要有条件,则这边db.query()中需要加上相应的参数
        例如,那边要查balance>? orderBy为  “balance DESC”,那么这边就要
       Cursor c = db.query("person",null,selection,selectionArgs,null,null,sortOrder);
        但是,另一个问题出现了,就是这里写死了查person表,如果数据库里有多个表,如何指定查哪张表呢?
        在外部应用在使用本程序的数据时,查哪张表,别人可以在Uri指定path,本程序要做对应处理,如何处理?
        分析,外部应用,指定查哪张表的uri:content://com.example.provider/person  后面的person(path)即为表名
        我们只要在本程序中可以拿到后面的表名就可以设置逻辑判断,分析结束
        解决方法:UriMatcher 对象的addURI("authorities",path,code)方法,给每个表一个数字编码
        具体代码如下:
        matcher.addURI(authorities,"person",0);
        matcher.addURI(authorities,"student",1);
        matcher.addURI(authorities,"person/#",2);
        UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        authorities就写Manifest中配置的。下面两行将person表的编码设为0,student表的编码设为1

        设完之后如何判断?matcher.match(uri),可以返回code
        判断查哪张表的逻辑已经清晰了(UriMatcher-->matcher.addURI(,,,)-->matcher.match(uri)-->得到code)
        现在又另外一个问题,我想查当前表的具体哪一个id,当然可以再外部程序调用时加上where条件
        外部程序中Cursor c =resolver.query("person",null,"id=?",new String[]{"10"},null);
        但是太麻烦。我想把id=࿱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值