ContentProvider简介:
一个内容提供者访问数据的中央资源库。提供者是应用程序的一部分,提供自己的操作数据的UI。然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者。提供者和提供者客户端为数据提供一个一致的,标准的接口,也处理进程间的联系和数据安全访问。
提供者向应用程序呈现数据就像一个或多张表,就像是在关系数据库里一样。一行显示一些数据类型的实例,列的每行显示实例数据集合的独立数据。
一个应用程序通过客户类ContentResolver访问内容提供者的数据。这个函数有一个在提供者对象里同名的函数,是一个ContentProvider子类的实例。函数ContentResolver提供”CRUD”的基础(创建,获取,更新,删除)函数。
拥有提供者的应用程序进程的ContentResolver对象和ContentProvider对象可以自动处理进程间的数据交换。
简而言之:ContentProvider以表的形式,向客户端提供了访问数据的API,通过ContentResolver实现进程间的数据共享。而进程间数据的共享通过uri来实现。
这里主要的实现方法:
private void getData() {
ArrayList data = new ArrayList<>();
//获取ContentResolver对象
ContentResolver cr = getContentResolver();
//查询contacts表
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (!cursor.moveToFirst()) {
Toast.makeText(this, "暂无内容", Toast.LENGTH_LONG).show();
}
while (cursor.moveToNext()) {
//获取联系人名字
UserModel model = new UserModel();
int nameId = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
String name = cursor.getString(nameId);
model.setName(name);
//获取电话号码
Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)), null, null);
//可能有多个号码
if (phoneCursor.moveToNext()) {
String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
model.setPhone(phone + ";");
}
//关闭cursor
phoneCursor.close();
data.add(model);
}
//关闭cursor
cursor.close();
adapter.getData(data);
}
注意点:cursor用完之后必须要close;这里通过nameId去查的是查不到手机号码的。
其他点注释 很清楚。
权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
这里需要注意一下
需要做6.0动态权限处理,以上做过论述,处理方式
绑定权限
PermissionGen.with(MainActivity.this)
.addRequestCode(100)
.permissions(
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS)
.request();
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
@PermissionSuccess(requestCode = 100)
public void doSomething() {
getData();
}
@PermissionFail(requestCode = 100)
public void doFailSomething() {
Toast.makeText(this, "Contact permission is not granted", Toast.LENGTH_SHORT).show();
}
添加依赖:
compile 'com.lovedise:permissiongen:0.0.6'
ContentProvider要点就是这么多。