内容提供者

内容提供者应用的数据库是不允许其他应用访问的内容提供者的作用就是让别的应用访问到你的数据库自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法 @Overridepublic Uri insert(Uri uri, ContentValues values) {    db.insert(“person”, null, values);    return uri;}在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址 创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作 public void click(View v){    //得到内容分解器对象    ContentResolver cr = getContentResolver();    ContentValues cv = new ContentValues();    cv.put(“name”, “小方”);    cv.put(“phone”, 138856);    cv.put(“money”, 3000);    //url:内容提供者的主机名    cr.insert(Uri.parse(“content://com.itheima.person”), cv);}UriMatcher用于判断一条uri跟指定的多条uri中的哪条匹配添加匹配规则 //指定多条urium.addURI(“com.itheima.person”, “person”, PERSON_CODE);um.addURI(“com.itheima.person”, “company”, COMPANY_CODE);//#号可以代表任意数字um.addURI(“com.itheima.person”, “person/#”, QUERY_ONE_PERSON_CODE);通过Uri匹配器可以实现操作不同的表 @Overridepublic Uri insert(Uri uri, ContentValues values) {    if(um.match(uri) == PERSON_CODE){        db.insert(“person”, null, values);    }    else if(um.match(uri) == COMPANY_CODE){        db.insert(“company”, null, values);    }    else{        throw new IllegalArgumentException();    }    return uri;}如果路径中带有数字,把数字提取出来的api int id = (int) ContentUris.parseId(uri); 短信数据库只需要关注sms表只需要关注4个字段body:短信内容address:短信的发件人或收件人号码(跟你聊天那哥们的号码)date:短信时间type:1为收到,2为发送读取系统短信,首先查询源码获得短信数据库内容提供者的主机名和路径,然后 ContentResolver cr = getContentResolver();Cursor c = cr.query(Uri.parse(“content://sms”), new String[]{“body”, “date”, “address”, “type”}, null, null, null);while(c.moveToNext()){    String body = c.getString(0);    String date = c.getString(1);    String address = c.getString(2);    String type = c.getString(3);    System.out.println(body+";" + date + “;” + address + “;” + type);}插入系统短信 ContentResolver cr = getContentResolver();ContentValues cv = new ContentValues();cv.put(“body”, “您尾号为XXXX的招行储蓄卡收到转账1,000,000人民币”);cv.put(“address”, 95555);cv.put(“type”, 1);cv.put(“date”, System.currentTimeMillis());cr.insert(Uri.parse(“content://sms”), cv)插入查询系统短信需要注册权限联系人数据库raw_contacts表:contact_id:联系人iddata表:联系人的具体信息,一个信息占一行data1:信息的具体内容raw_contact_id:联系人id,描述信息属于哪个联系人mimetype_id:描述信息是属于什么类型mimetypes表:通过mimetype_id到该表查看具体类型读取联系人先查询raw_contacts表拿到联系人id Cursor cursor = cr.query(Uri.parse(“content://com.android.contacts/raw_contacts”), new String[]{“contact_id”}, null, null, null);然后拿着联系人id去data表查询属于该联系人的信息 Cursor c = cr.query(Uri.parse(“content://com.android.contacts/data”), new String[]{“data1”, “mimetype”}, “raw_contact_id = ?”, new String[]{contactId}, null); 得到data1字段的值,就是联系人的信息,通过mimetype判断是什么类型的信息 while(c.moveToNext()){    String data1 = c.getString(0);    String mimetype = c.getString(1);    if(“vnd.android.cursor.item/email_v2”.equals(mimetype)){        contact.setEmail(data1);    }    else if(“vnd.android.cursor.item/name”.equals(mimetype)){        contact.setName(data1);    }    else if(“vnd.android.cursor.item/phone_v2”.equals(mimetype)){        contact.setPhone(data1);    }} 插入联系人先查询raw_contacts表,确定新的联系人的id应该是多少把确定的联系人id插入raw_contacts表 cv.put(“contact_id”, _id);cr.insert(Uri.parse(“content://com.android.contacts/raw_contacts”), cv);插3个字段:data1、mimetype、raw_contact_id cv = new ContentValues();cv.put(“data1”, “赵六”);cv.put(“mimetype”, “vnd.android.cursor.item/name”);cv.put(“raw_contact_id”, _id);cr.insert(Uri.parse(“content://com.android.contacts/data”), cv); cv = new ContentValues();cv.put(“data1”, “1596874”);cv.put(“mimetype”, “vnd.android.cursor.item/phone_v2”);cv.put(“raw_contact_id”, _id);cr.insert(Uri.parse(“content://com.android.contacts/data”), cv);内容观察者当数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知 cr.registerContentObserver(Uri.parse(“content://sms”), true, new MyObserver(new Handler())); class MyObserver extends ContentObserver{     public MyObserver(Handler handler) {        super(handler);        // TODO Auto-generated constructor stub    }     //内容观察者收到数据库发生改变的通知时,会调用此方法    @Override    public void onChange(boolean selfChange) {     } } ContentResolver cr = getContext().getContentResolver();//发出通知,所有注册在这个uri上的内容观察者都可以收到通知cr.notifyChange(uri, null);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值