1、ContentProvider :内容提供者。

用来干什么:1、可以分享数据给其它的应用。(相当于一个中间人提供上线的数据给下线,上线和下线之间不打交道,联系全靠中间人,这种格式是统一固定的)。

具体用法场景:1、使用现有的内容提供器来读取相应程序的数据----可以读取电话、短信中的内容

                        2、创建自己的内容提供器给程序的数据提供外部访问接口

理解基础知识:URI、MIME数据类型、ContentResolver(内容解析者)、ContentObserver(内容观察者)?

部分解释说明:

1、ContentProvider: 是一个抽象的类,要使用这个类时,需要实现六个abstract方法。

2、ContentResolver:其他APP或者进程操作ContentProvider,需要现获取相应的ContentResolver,再利用ContentResolver类完成对数据的操作。

3、URI:在数据库中我们在查询的时候需要表名,在这里专门提供了一个 内容URI,给内容提供器中的数据建立唯一标识符;

content:// com.example.app.provider/table1

字段

对应

含义

前缀主题

content://  

固定格式;并将此标识为内容 URI

 

授权

com.example.app.provider

唯一标识provider,表示程序的授权

路径

/table1/1

表的路径


1、query函数: query(Uri,projection,selection,selectionArgs,sortOrder) 可以理解成:

SELECT _ID, word, locale FROM words WHERE word = <userinput> ORDER BY word ASC;

query() 参数

SELECT 关键字/参数

说明

Uri

FROM table_name

Uri 映射至提供程序中名为 table_name 的表。

projection

col,col,col,...

projection 是应该为检索到的每个行包含的列的数组。

selection

WHERE col = value

selection 会指定选择行的条件。

selectionArgs

(没有完全等效项。选择参数会替换选择子句中 ? 占位符。)

sortOrder

ORDER BY col,col,...

sortOrder 指定行在返回的 Cursor 中的显示顺序。

 1、查询操作:

增加相应的权限:<uses-permission android:name="android.permission.READ_USER_DICTIONARY">

可基本通过以下步骤操作:

public void getContactnameByNameber(){
        ContentResolver resolver = getContentResolver();
        //cusor:游标 会返回包含指定条件的行和列
        Cursor cusor = resolver.query(ContactsContract.Contacts.CONTENT_URI,new String[]{ContactsContract.Data.DISPLAY_NAME},null,null,null);
        if(cusor !=null){
           while(cusor.moveToFirst()){
                String name = cusor.getString(index);
                Log.i(TAG,name);
            }
        }else{

        }
        cusor.close();
    }

2、插入数据:insert(Uri url, ContentValues values)

 /**
    * 新增一条通话记录
    *
    * */
    public static void insertCallLog(Context context,String sNumber)
    {
        ContentValues values = new ContentValues();
        values.put(CallLog.Calls.NUMBER, sNumber);
        values.put(CallLog.Calls.DATE, System.currentTimeMillis());// 来电时间
        values.put(CallLog.Calls.DURATION, "1000");// 通话时长
        values.put(CallLog.Calls.TYPE, 1);// 1来电,2去电,3未接
        values.put(CallLog.Calls.NEW, "1");// 0已看,1未看
        context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
    }

3、删除数据:delete(Uri url, String where, String[] selectionArgs)

 /**
     * 删除通话记录
     */
    public static void deleteAllCallLogs(Context cn) {
        ContentResolver resolver = cn.getContentResolver();
        resolver.delete(CallLog.Calls.CONTENT_URI, "_id!=-1", null);
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐