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

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

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

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

代码如下:

java 复制代码
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);
    }

结果:

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

java 复制代码
 //事务操作【批处理操作】
    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();
        }

    }

通讯录的查询操作:

java 复制代码
 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();
        }
相关推荐
萌面小侠Plus7 分钟前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农7 分钟前
Android Profiler 内存分析
android
大风起兮云飞扬丶8 分钟前
Android——多线程、线程通信、handler机制
android
L725614 分钟前
Android的Handler
android
清风徐来辽15 分钟前
Android HandlerThread 基础
android
HerayChen1 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing11231 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件2 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
dj15402252032 小时前
group_concat配置影响程序出bug
android·bug