重点:理解ContentProvider 的作用和创建流程
1. 内容提供者,提供 其他数据库的访问。
特点
- 描述 : 它是android 四大组件之一,需要androidManifestxml 注册,没有界面,为第三方的应用提供访问数据的标准接口
- 作用 : 1. 共享数据给第三方应用 2. 统一数据访问的平台
- 线程安全的问题 : 内容提供者是线程安全的 ,内容提供者是单例模式 ,且对相应的接口方法实现了同步锁(synchronized) ,由 内容访问者和内容提供者共同维护线程安全
内容提供者需要在配置清单中 配置
1 <provider android:name="" 2 android:authorities="" 3 android:exported="true"></provider>
2.通过ContentProvider共享数据实现流程
* 准备要共享的数据,一般就是sqlite数据库
* 编写类,继承ContentProvider ,并且实现相应的接口方法(增删改查、getType: 获取要访问的数据的MIME类型(*/image,*/video,text/plain ))
* 内容提供者在AndroidManifest.xml注册,并且设置 认证或者权限 ,android:authories (它是该内容提供者的唯一标识)
* 第三方应用通过内容解决者来访问 ContentProvider
ContentResolver resolver=Content().getContentResolver()
- 增上改查
public void onClick(View v) { // TODO Auto-generated method stub ContentResolver cr = getContentResolver(); switch (v.getId()) { case R.id.save: Cursor cur = cr.query(Uri.parse("content://sms"), new String[]{"address","date","type","body"} , null, null, null); while(cur.moveToNext()){ String address = cur.getString(0); String date = cur.getString(1); String type = cur.getString(2); String body = cur.getString(3); System.out.println(address + "--" + date + "--" + type+ "--"+ body ); } break; case R.id.insert: ContentValues cv = new ContentValues(); cv.put("address", 95558); cv.put("date", System.currentTimeMillis() ); cv.put("type", 1); cv.put("body", "你已转账1,000,000元"); cr.insert(Uri.parse("content://sms"), cv); break; } }
3.常用的API
1. Uri :统一资源标识符,它比url更细粒度 ,可以标识 数据库中的表的记录的某个字段
作用: 表示你要操作的数据
2. UriMatch :匹配Uri 地址
3. ContentUris :内容Uri :主要解析id或者拼id
4.访问系统提供的内容提供者
- uri:content://sms : 短信
字段: "_id", "address", "body", "read", "date", "type", "protocol"
- Uri:content://call_log/calls :通话记录
字段:_id、number、date、duration
通话记录权限
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
View Code