Android基础开发-通讯录的添加和查询

news2024/11/25 11:33:41

案例:往手机通讯录添加信息,输入姓名和手机号。

保存的手机的表:一共有两个,一个是主表,提供一个联系人id,另外是辅表,提供id对应的手机号和姓名。

普通操作:一个表一个表的添加

代码如下:

public void addContact(View view) {
//        addContacts(getContentResolver(),new Contact("pansd","17864195555"));
        Contact contact = new Contact("hello", "17864195555");
        ContentResolver contentResolver = getContentResolver();
        ContentValues values = new ContentValues();
//        values.put("hello",contact.getName());
//        values.put("phone",contact.getPhone());
        //返回的是插入的id【插入主表】
        Uri uri = contentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
        long rawContactId = ContentUris.parseId(uri);

        //插入关联表

        ContentValues nameValue = new ContentValues();
        //关联联系人编号
        nameValue.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        //关联姓名的数据类型
        nameValue.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        //关联联系人的姓名
        nameValue.put(ContactsContract.Contacts.Data.DATA2,contact.getName());
        //插入关联表
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,nameValue);


        ContentValues phoneValue = new ContentValues();
        //关联联系人编号
        phoneValue.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        //关联电话号码的数据类型
        phoneValue.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        //关联联系人的电话号码[1代表家庭 2代表工作]
        phoneValue.put(ContactsContract.Contacts.Data.DATA1,contact.getPhone());
        phoneValue.put(ContactsContract.Contacts.Data.DATA2, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        //插入关联表
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,phoneValue);


        ContentValues emailValues = new ContentValues();
        emailValues.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        emailValues.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
        emailValues.put(ContactsContract.Contacts.Data.DATA1,"faskdfa@163.com");
        emailValues.put(ContactsContract.Contacts.Data.DATA2, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,emailValues);
    }

结果:

事务操作,添加联系人到主表和辅表

 //事务操作【批处理操作】
    public void addContacts2(ContentResolver contentResolver,Contact contact){

        ArrayList<ContentProviderOperation> ops = new ArrayList<>();

        ContentProviderOperation op_main = ContentProviderOperation
                .newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build();

        ops.add(op_main);

        // 添加姓名信息
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName())
                .build());

        // 添加电话号码信息
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone())
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                .build());

        try {
            // 执行批量操作
            ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException | OperationApplicationException e) {
            e.printStackTrace();
        }

    }

通讯录的查询操作: 

 ContentResolver contentResolver = getContentResolver();
        // 查询联系人数据
        Cursor contactsCursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        if (contactsCursor != null && contactsCursor.getCount() > 0) {
            while (contactsCursor.moveToNext()) {
                String contactId = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
                String displayName = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                // 查询电话号码
                Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{contactId}, null);
                if (phoneCursor != null && phoneCursor.moveToFirst()) {
                    String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                    // 打印联系人姓名和电话号码
                    System.out.println("Name: " + displayName + ", Phone Number: " + phoneNumber);

                    phoneCursor.close();
                }
            }

            contactsCursor.close();
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1512066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThingsBoard开源物联网平台介绍

1. Thingsboard 简介 ThingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。它使用行业标准的物联网协议&#xff08;MQTT、CoAP和HTTP&#xff09;实现设备连接&#xff0c;并支持云和本地部署。ThingsBoard结合了可扩展性、容错…

synchronized关键字(锁升级)

概述 synchronized是Java的一个关键字&#xff0c;用来保证多线程下临界区资源的共享安全性 synchronized可以加在方法上&#xff08;静态方法和普通方法&#xff09;、代码块上 使用语法&#xff1a; synchronized (对象) {// 操作临界资源 }public synchronized void te…

云起云落:揭秘云计算基础内功心法

文章目录 云计算基本概念云计算发展历程云计算计算模式云计算商业模式云计算部署模式私有云部署公有云部署混合云部署 云计算虚拟化技术虚拟机模式虚拟化容器模式虚拟化容器VS虚拟机 常见虚拟化工具和技术虚拟化工具“轻量级”虚拟化工具 云计算供应商云计算三要点&#xff08;…

用miniconda建立PyTorch、Keras、TensorFlow三个环境

一、配置清华镜像conda源 由于网络问题&#xff0c;直接使用conda默认的源下载包可能会非常慢。为了解决这个问题&#xff0c;可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤&#xff1a; 1. 配置清华conda…

案例分析篇14:信息系统安全设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-LSTM变分模态分解结合卷积神经网络结合长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介…

ARM64汇编06 - 基本整型运算指令

ADD (immediate) 将 Xn 与 imm 相加&#xff0c;结果赋值给 Xd&#xff0c;imm 是无符号数&#xff0c;范围为 0 - 4095。 shift 是对 imm 进行移位&#xff0c;shift 为 0 的时候&#xff0c;表示左移 0 位&#xff0c;即不变。shift 为 1 的时候&#xff0c;表示左移12 位&a…

Django 学习笔记(Day1)

「写在前面」 本文为千锋教育 Django 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Django 快速入门 1.1 Django 介绍 1.2 Django 安装 1.3 创建 Django 项目 1.4 运行 Django 项目 1.5 数据迁…

使用 Ruby 或 Python 在文件中查找

对于经常使用爬虫的我来说&#xff0c;在大多数文本编辑器都会有“在文件中查找”功能&#xff0c;主要是方便快捷的查找自己说需要的内容&#xff0c;那我有咩有可能用Ruby 或 Python实现类似的查找功能&#xff1f;这些功能又能怎么实现&#xff1f; 问题背景 许多流行的文本…

vite 安装tailwindcss失效

需求&#xff1a;在vite5 vue3 ts中安装tailwindcss 问题&#xff1a;按照tailwindcss的官方文档进行安装&#xff0c;可是一直不生效 解决方式&#xff1a; 在mian.ts 里面导出 style.css 文件 就可以了哈

【HomeAssistant新版文件管理器】

【HomeAssistant新版文件管理器】 1. 前言2. 地址3. 安装4. 使用方法5. 总结欢迎大家阅读2345VOR的博客【Home Assistant 之QQ邮箱推送提醒】🥳🥳🥳2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号🎉🎉、阿里云《arduino专家博主》👻👻👻,座右铭:…

基于Springboot的预报名管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的预报名管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

从根到叶:深入了解Map和Set

窗间映出一片高远的天空&#xff0c; 向晚的天际宁静而又清明。 我孤独的心灵在幸福地哭泣&#xff0c; 它在为天空如此美好而高兴。 恬静的晚霞一片火红&#xff0c; 晚霞灼烧着我的热情。 此刻的世界没有别人&#xff0c; 只有上帝&#xff0c;我和天空。 ——&#x…

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源&#xff0c;对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核&#xff0c;其框图如下&#xff1a; clk_in 输入时钟&#…

Grafana

介绍 官网&#xff1a;https://grafana.com/ Grafana 是一个开源的指标分析和可视化工具&#xff0c;它被广泛用于展示和监控云基础设施和应用程序的实时数据。Grafana 提供了一个强大且易于使用的界面&#xff0c;允许用户创建各种图表、图形和仪表盘&#xff0c;以直观地展…

【漏洞复现】大华智慧园区综合管理平台SQL注入漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

Web3:数字身份与隐私保护的新篇章

1. 数字身份验证的革新 在传统互联网上&#xff0c;个人的数字身份通常由中心化的身份验证机构控制&#xff0c;存在安全性和隐私保护的风险。而在Web3中&#xff0c;基于区块链技术的去中心化身份验证方案正在兴起。通过使用分布式账本和加密技术&#xff0c;Web3可以提供更安…

122. 买卖股票的最佳时机 II(力扣LeetCode)

文章目录 122. 买卖股票的最佳时机 II题目描述贪心 122. 买卖股票的最佳时机 II 题目描述 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。…

力扣题目汇总分析 利用单调栈解决问题

496 下一个更大元素 I 问题 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。为nums1中每个数字 x找到下一…

nvm 的安装与管理 node.js

文章目录 下载 nvm使用 nvm 下载与管理 node.jsnpm 切换镜像源使用 cnpm使用 yarn 下载 nvm NVM是Node.js的版本管理工具&#xff0c;它允许你轻松地在同一台机器上安装和切换不同版本的Node.js。使用NVM&#xff0c;你可以在不同的项目中使用不同的Node.js版本&#xff0c;而…