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();
        }
相关推荐
sweetying41 分钟前
30了,人生按部就班
android·程序员
用户2018792831671 小时前
Binder驱动缓冲区的工作机制答疑
android
真夜1 小时前
关于rngh手势与Slider组件手势与事件冲突解决问题记录
android·javascript·app
用户2018792831671 小时前
浅析Binder通信的三种调用方式
android
用户092 小时前
深入了解 Android 16KB内存页面
android·kotlin
火车叼位3 小时前
Android Studio与命令行Gradle表现不一致问题分析
android
前行的小黑炭5 小时前
【Android】 Context使用不当,存在内存泄漏,语言不生效等等
android·kotlin·app
前行的小黑炭6 小时前
【Android】CoordinatorLayout详解;实现一个交互动画的效果(上滑隐藏,下滑出现);附例子
android·kotlin·app
用户20187928316718 小时前
Android黑夜白天模式切换原理分析
android
芦半山18 小时前
「幽灵调用」背后的真相:一个隐藏多年的Android原生Bug
android