• 四大组件---ContentResolver



    内容提供器的用法一般有两种:
    (1) 使用现有的内容提供器来读取和操作相应程序的数据
    (2) 创建自己的内容提供器给我们程序的数据提供外部接口。

    一、 ContentResolver的基本用法

    ContentResolver是通过URI来查询ContentProvider中提供的数据。

    内容URI标准写法如下:

    content://com.example.app.provider/table1
    
    • 1

    内容URI字符串能清楚的表达出是哪个程序的哪个表。ContentResolver中的增删改查方法接收内容URI。需要把URI字符串解析成URI对象。调用Uri.parse()方法即可解析。

    Uri uri = Uri.parse("content://com.example.app.provider/table1")
    
    • 1

    用URI对象查询表table1表中数据

    Cursor cursor = getContentResolver().query(
        uri,
        projection,
        selection,
        selectionArgs,
        sortOrder);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    查询完成后返回的仍然是Cursor对象,将数据从crsor对象中逐个读取

    if(cursor != null){
        while(cursor.moveToNext()){
            String column1 = cursor.getString(cursor.getColunmIndex("colunm1"));
            int column2 = cursor.getInt(cursor.getColumnIndex("column2");
        }
        cursor.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加

    ContentValues values = new ContentValues();
    values.put("column1", "text");
    valuse.put("column2", 1);
    getContentResolver().insert(uri.values);
    
    • 1
    • 2
    • 3
    • 4

    更新

    ContentValues values = new ContentValues();
    values.put("column1", "");
    getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[]{"text","1"});
    
    • 1
    • 2
    • 3

    删除

    getContentResolver().delete(uri, "column2 = ?", new String[]{"1"});
    
    • 1

    二、 读取系统联系人

    首先先创建三个联系人

    在这里插入图片描述

    希望最终读取出的联系人信息能在ListView中显示出来。修改主活动xml文件

    新建一个列表

    修改主活动代码

    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 != null) {
                        //获取联系人姓名
                        @SuppressLint("Range") String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        @SuppressLint("Range") 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();
                }
            }
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        readContacts();
                    } else {
                        Toast.makeText(this, "u denied the permission", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在AndriodMainfest.xml修改代码

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    
    • 1

    在这里插入图片描述

    点击ALLOW,联系人的数据都成功读取出来了,说明跨程序访问数据的功能确实是实现了。

    在这里插入图片描述

  • 相关阅读:
    视频批注软件哪个好用 分秒帧在线批注怎么用
    线上动态解析protobuf文件,实现动态热更新
    Python读取mongodb数据库
    R 数据可视化: PCA 主成分分析图
    【计算机毕业设计】094图书馆自习室座位预约管理微信小程序
    k8s集群StatefulSets的Pod调度查询丢失问题?
    使用AOP做日志切面
    Pytorch之ConvNeXt图像分类
    SpringBoot实现SSMP整合
    C++基础(2022.9.3)
  • 原文地址:https://blog.csdn.net/qq_48019875/article/details/126217902