目录
一、ContentResolver基本用法
如何查询?
如何向表中添加一条数据?
如何更新这条新添加的数据?
如何删除这条数据?
二、读取系统联系人
要想你的APP访问其他应用程序的数据,需要使用内容提供器,下面使用现有的内容提供器来读取和操作相应程序中的数据。
一、ContentResolver基本用法
如果想要访问内容提供器中共享的数据,需要借助ContentResolver类,其提供了一系列方法用于对数据CRUD操作。
ContentResolver中的增删改查方法接收一个Uri参数,这个参数称为内容URI,为内容提供器中的数据建立了唯一的标识符,主要由两部分组成:authority和path。authority用于对不同的应用程序做区分,一般采用程序包名;path用于对同一应用程序中不同的表做区分,如:某个程序的数据库里存在一张表:table1,这时的内容URI就是com.example.app.provider/table1,标准格式是:content://com.example.app.provider/table1。
得到内容URI字符串后,将它解析称URI对象才可以作为参数传入,方法如下:
Uri uri = Uri.parse("content://com.example.app.provider/table1")
只需要调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象了。
现在可以使用这个Uri对象来查询table1表中的数据了,代码如下:
Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder
);
下表对使用的参数作了详细的解释:
如何查询?
查询完之后仍然是一个Cursor对象,读取的思路仍然是遍历Cursor的所有行,再取出每一行中相应列的数据,代码如下:
if(cursor!=null){
while (cursor.moveToNext()){
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int cloumn2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
cursor.close();
}
如何向表中添加一条数据?
代码如下:
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2",1);
getContentResolver().insert(uri,values);
如何更新这条新添加的数据?
代码如下:
ContentValues values = new ContentValues();
values.put("column1","");
getContentResolver().update(uri,values,"column1=? and column2 = ?",new String[] {"text","1"});
如何删除这条数据?
代码如下:
getContentResolver().delete(uri,"column2 = ?",new String[] { "1" });
下面通过读取系统联系人来实践一下。
二、读取系统联系人
首先在模拟器里手动添加几个联系人
然后新建一个ContactsTest项目。
修改activity_main.xml代码,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/contacts_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
修改MainActivity代码,如下:
因为READ_CONTACTS属于危险权限,首先处理运行时权限,用户授权之后调用readContacts()方法来读取联系人信息。
readContacts()方法使用了ContentResolver的query()方法,不过传入的Uri和前面不一样,这是因为ContactsContract.CommonDataKinds.Phone类已经做好了封装,提供了一个CONTENT_URI常量,这个常量就是解析出来的结果。接着将姓名和手机号逐一取出,其各有对应的常量。
public class MainActivity extends AppCompatActivity {
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
}else{
readContacts();
}
}
private void readContacts(){
Cursor cursor = null;
try {
// 查询联系人数据
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if(cursor != null){
while (cursor.moveToNext()){
// 获取联系人姓名
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// 获取联系人手机号
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayName + "\n" + number);
}
adapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(cursor != null){
cursor.close();
}
}
}
public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
readContacts();
}else{
Toast.makeText(this, "你拒绝了权限申请", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
最后需要声明读取系统联系人的权限,修改AndroidManifest.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.contactstest">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
...............
效果如下: