其他分享
首页 > 其他分享> > 四大组件之一 ContentProvider

四大组件之一 ContentProvider

作者:互联网

ContentProvider


前言

本文记录四大组件之一contentprovider学习,从官方文档 .中学习,从创建数据库SQLiteOpenHelper,到利用提供者分享数据,监听内容变化,只记录简单的方法的使用和一些小事例,

ContentProvider的概述

内容提供程序有助于应用管理其自身和其他应用所存储数据的访问,并提供与其他应用共享数据的方法。它们会封装数据,并提供用于定义数据安全性的机制。内容提供程序是一种标准接口,可将一个进程中的数据与另一个进程中运行的代码进行连。最重要的是,通过配置内容提供程序,您可以使其他应用安全地访问和修改您的应用数据。
简而言之:则是提供一个标准接口,给外部应用操作自己应用的数据库。

数据库的创建

ContentProvider 的使用

内容观察者

日历事件的运用

日历提供者
一键插入事件,通过ContentResolver对象 insert方法
以下是插入新事件的规则:

  //1:事件表 2.应用weibo相关信息表 3:联系人生日表
        long calID = 1;
        long startMillis = 0;
        long endMillis = 0;
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2021, 10, 11, 0, 0);
        startMillis = beginTime.getTimeInMillis();
        Calendar endTime = Calendar.getInstance();
        endTime.set(2021, 10, 11, 23, 59);
        endMillis = endTime.getTimeInMillis();

        String timeZone= TimeZone.getDefault().getID();
        Log.d(TAG,timeZone);

        ContentResolver cr = getContentResolver();
        ContentValues eventValues = new ContentValues();
        eventValues.put(CalendarContract.Events.DTSTART, startMillis);
        eventValues.put(CalendarContract.Events.DTEND, endMillis);
        eventValues.put(CalendarContract.Events.TITLE, "双十一购物狂欢节开抢");
        eventValues.put(CalendarContract.Events.DESCRIPTION, "尽情买买买!!");
        eventValues.put(CalendarContract.Events.CALENDAR_ID, calID);
        eventValues.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);
        Uri resultUri = cr.insert(CalendarContract.Events.CONTENT_URI, eventValues);
        Log.d(TAG,"返回结果"+resultUri);

        String eventID = resultUri.getLastPathSegment();
        Log.d(TAG,eventID);
        ContentValues reminderValues = new ContentValues();
        reminderValues.put(CalendarContract.Reminders.MINUTES, 15);
        reminderValues.put(CalendarContract.Reminders.EVENT_ID, eventID);
        reminderValues.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
        Uri uri1 = cr.insert(CalendarContract.Reminders.CONTENT_URI, reminderValues);

联系人提供者

ContentResolver cr = getContentResolver();
        Uri rawUri = Uri.parse("content://"+ContactsContract.AUTHORITY+"/raw_contacts");
        Cursor rawCursor = cr.query(rawUri, new String[]{"contact_id","display_name"}, null, null, null);
        String[] columnNames = rawCursor.getColumnNames();

        List<UserInfo> userInfos=new ArrayList<>();
        while (rawCursor.moveToNext()) {
            UserInfo userInfo=new UserInfo();
            userInfo.setId(rawCursor.getString(rawCursor.getColumnIndex("contact_id")));
            userInfo.setDisplayName(rawCursor.getString(rawCursor.getColumnIndex("display_name")));
            userInfos.add(userInfo);
            for (String columnName : columnNames) {
                Log.d(TAG,columnName+" ======= "+rawCursor.getString(rawCursor.getColumnIndex(columnName)));
            }
        }
        rawCursor.close();
        Uri phoneUri = Uri.parse("content://"+ContactsContract.AUTHORITY+"/data/phones");
        for (UserInfo userInfo : userInfos) {
            Cursor phoneCursor = cr.query(phoneUri, new String[]{"data1"}, "raw_contact_id=?", new String[]{userInfo.getId()}, null);
            if (phoneCursor.moveToNext()) {
                userInfo.setPhoneNumber(phoneCursor.getString(0).replace("-",""));
            }
            Log.d(TAG,"userInfo ===>"+userInfo);
            phoneCursor.close();
        }
        /*for (UserInfo userInfo : userInfos) {
            Cursor phoneCursor = cr.query(phoneUri, null, "raw_contact_id=?", new String[]{userInfo.getId()}, null);
            String[] columnNames1 = phoneCursor.getColumnNames();
            while (phoneCursor.moveToNext()) {

                for (String columnName : columnNames1) {
                    Log.d(TAG, columnName + " ======= " + phoneCursor.getString(phoneCursor.getColumnIndex(columnName)));
                }
            }
            phoneCursor.close();
        }*/

这里只能读到手机的联系人手机号,sd卡上无法读取。但能看到联系人的名字,可能得通过另一个数据库去查询。

消息提供者

 ContentResolver contentResolver = getContentResolver();
        Uri uri=Uri.parse("content://sms");
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        String[] columnNames = cursor.getColumnNames();
        while (cursor.moveToNext()) {
            for (String columnName : columnNames) {
                Log.d(TAG,columnName+" ==== "+cursor.getString(cursor.getColumnIndex(columnName)));
            }
        }
        cursor.close();

通过registerContentObserver 内容观察者来获取消息的实时验证吗

  1. 通过监听sms的数据库变化,获取数据变化的Uri
  2. 通过Uri查询数据库的短信
  3. 对短信进行正则化表达式过滤获取 验证码

获取媒体库提供者形成9宫图返回

标签:ContentProvider,数据库,CalendarContract,Uri,四大,组件,new,null,方法
来源: https://blog.csdn.net/sumjim234/article/details/113585684