这一篇记录下安卓的组件之一ContentProvider,这个组件的主要做用有两个,一个是经过该组件访问其余应用暴露出来的数据,另外一个做用就是将本身应用中的数据选择性的暴露给其余的应用。下面就讲解一下该组件的一些基本概念,以及基本的使用方式。android
ContentProvider 简单使用sql
Query
下面讲解一下如何提取系统提供的一些数据,最经常使用的就是获取系统中的联系人信息。
须要注意的一点是,读取联系人信息,须要添加权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
数据库
private void getContacts(){ ContentResolver resolver = getContentResolver(); Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; Cursor cursor = resolver.query(uri, null, null, null, null); assert cursor != null; while(cursor.moveToNext()) { String cName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.d(TAG,"姓名:" + cName); Log.d(TAG,"号码:" + cNum); } cursor.close(); }
上面这一段代码,就是一个最基础的用法,利用了resolver获取数据。只是调用了query方法,这个方法的参数以下:app
Insert
插入这一块也利用联系人进行信息进行展现,一样的须要添加一些权限控制, <uses-permission android:name="android.permission.WRITE_CONTACTS" />
下面直接给出代码:ide
private void insertContact() throws RemoteException, OperationApplicationException { //使用事务添加联系人 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); ContentResolver resolver = getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null) .build(); operations.add(op1); //依次是姓名,号码,邮箱 ContentProviderOperation op2 = ContentProviderOperation.newInsert(dataUri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "zorpan") .build(); operations.add(op2); ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", "17806236835") .withValue("data2", "2") .build(); operations.add(op3); ContentProviderOperation op4 = ContentProviderOperation.newInsert(dataUri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/email_v2") .withValue("data1", "728606401@qq.com") .withValue("data2", "2") .build(); operations.add(op4); //将上述内容添加到手机联系人中 resolver.applyBatch("com.android.contacts", operations); Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_SHORT).show(); }
代码就是这样,很简单,涉及到的就是一个数据类ContentProviderOperation ,这个类是用来存储Content数据,具体的细节就很少说了,这个类在sdk能够直接查看。每一个字段都有详细的解释。学习