Android 内容提供器

本文详细介绍了Android中的内容提供器,包括如何访问其他程序数据、创建自己的内容提供器及其核心方法如query、insert、update和delete。内容提供器通过ContentResolver与Uri进行数据操作,并确保数据隐私安全。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值