Android 内容提供器
访问其他程序中的数据
引言
如果想要访问内容提供器中共享的数据,需借助ContentResolver类,可以通过Context中的getContentResolver方法获取该类的实例,该类中提供了一系列的方法便于对数据进行增(insert)删(delete)改(update)查(query)操作,是不是跟数据库很像,但是区别还是有的,而且不小!!!这个类不接受表名作为参数,而是接受一个Uri作为参数,该Uri由两部分组成:其一是目标APP的包名加上”.provider“字符串,其二是具体的表,这样就细致到了每一个APP的每一个表,不会冲突!!当然,最标准的Uri的写法还要加上协议声明,所以Uri最标准的格式为:content://com.example.app.provider/table1
得到Uri之后,还要将它解析成Uri对象才可以作为参数传入,用Uri.parse方法就能实现,传入标准的Uri就能自动解析了,然后就可以用得到的解析完成的Uri对象了!
查询:
Cursor cursor = getContentResolver().query(uri , projection , selection , selectionArgs , sortOrder);
query()方法参数 | 对应SQL部分 | 描述 |
---|---|---|
uri | from table_name | 指定查询某个应用程序下的某一张表 |
projection | select column1 , column2 | 指定查询的列名 |
selection | where column = value | 指定where的约束条件 |
selectionArgs | - | 为where中的占位符提供具体的值 |
sortOrder | order by column1 , column2 | 指定查询结果的排列方式 |
可以对返回的Cursor对象进行遍历得到想要的数据!如:
if(cursor != null) {
while(cursor.moveToNext()) {
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
}
增加:
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 , "column = ? and column2 = ?" , new String[] {
"text" , "1"});
删除:
getContentResolver().delete(uri , "column2 = ?" , new String[] {
"1"});
实例
代码实例
编写修改activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/contacts_view"/>
</LinearLayout>
编写修改MainActivity.java文件:
public class MainActivity extends AppCompatActivity {
private ArrayAdapter<String> adapter;
private List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView contactsView = 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