ContentProvider & ContentResolver

实现contentresolver 结合手机的联系人来完成一个简单的联系人管理的工具demo

实现contentresolver 结合手机的联系人来完成一个简单的联系人管理的工具demo
 */
public class MainActivity extends Activity {

    // 获取联系人
    // 首先需要的是联系人的CotentProvider的Uri;这些是系统提供给开发者的
    // Uri uri_contacts = ContactsContract.Contacts.CONTENT_URI;
    // Uri uri_contacts_phones =
    // ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    // Uri uri_contacts_emails =
    // ContactsContract.CommonDataKinds.Email.CONTENT_URI;

    // 实际上这两种获取uri的方式最终获取到的数据并不一样,地下这个获取的更加多(包括已经删除的,但是表中还存在)
    Uri uri_contacts = Uri.parse("content://com.android.contacts/raw_contacts");
    Uri uri_contacts_phones = Uri
            .parse("content://com.android.contacts/data/phones");
    Uri uri_contacts_emails = Uri
            .parse("content://com.android.contacts/data/emails");
    // 从raw_contacts表中或许联系人的id和联系人的姓名。

    private List<Map<String, Object>> listContacts = new ArrayList<Map<String, Object>>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.textView1);
        // 调用方法
        listContacts = getList_contacts(getContentResolver());
        tv.setText(listContacts.toString());
    }

    // 获取联系人信息的方法(查)
    public List<Map<String, Object>> getList_contacts(ContentResolver resolver) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        // 使用resolver查询query()是五个参数(uri,规划要查询的字段,查询语句,替代?的词,排序方式)
        // 需要一个Cursor对象来接收查询到的数据
        Cursor cursor = resolver.query(uri_contacts, new String[] { "_id",
                "display_name" }, null, null, null);

        // 要展示数据需要对cursor对象来遍历
        while (cursor.moveToNext()) {
            int contacts_id = cursor.getInt(cursor.getColumnIndex("_id"));
            String contacts_name = cursor.getString(cursor
                    .getColumnIndex("display_name"));
            // 用Map来存储每一个联系人
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id", contacts_id + "");
            map.put("name", contacts_name);
            // 剩下的就是把该联系人的email和电话号码查出来加到map中
            Cursor cursor_phones = resolver
                    .query(uri_contacts_phones, new String[] {
                            "raw_contact_id", "data1" }, "raw_contact_id=?",
                            new String[] { contacts_id + "" }, null);
            while (cursor_phones.moveToNext()) {
                // 因为此查的是第二列,我们直接写1就可以了(第一列是id,第二列是phones 我们应该事先知道)
                // 由于这个电话可能为多个,所以还是用“|”隔开 用更节省空间的Stringbuffer来做
                StringBuffer phone = new StringBuffer();
                phone = phone.append("|" + cursor_phones.getString(1));
                map.put("phones", phone.toString());

            }
            // 获取emails
            Cursor cursor_emails = resolver
                    .query(uri_contacts_emails, new String[] {
                            "raw_contact_id", "data1" }, "raw_contact_id=?",
                            new String[] { contacts_id + "" }, null);
            while (cursor_emails.moveToNext()) {
                StringBuffer sb = new StringBuffer();
                sb = sb.append("|" + cursor_emails.getString(1));
                map.put("emails", sb.toString());
            }

            list.add(map);
        }

        return list;

    }

    //向联系人插入一条联系人
    // 以下方法是利用常量值所写的插入联系人的方法。如果希望封装成方法,再增加一个Map集合的参数,用来传入信息即可。

    public void insertContacts(ContentValues values, ContentResolver resolver) {

    // 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId

    Uri rawContactUri = resolver.insert(

    ContactsContract.RawContacts.CONTENT_URI, values);

    long rawContactId = ContentUris.parseId(rawContactUri);

    // 往data表入姓名数据

    values.clear();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);

    values.put(

    ContactsContract.Data.MIMETYPE,

    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);

    values.put(

    ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,

    "chen");

    values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,

    "chen");

    resolver.insert(ContactsContract.Data.CONTENT_URI, values);

    // 往data表入电话数据

    values.clear();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);

    values.put(ContactsContract.Data.MIMETYPE,

    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);

    values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13520551441");

    values.put(ContactsContract.CommonDataKinds.Phone.TYPE,

    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);

    resolver.insert(ContactsContract.Data.CONTENT_URI, values);

    // 往data表入Email数据

    values.clear();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);

    values.put(ContactsContract.Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);

    values.put(ContactsContract.CommonDataKinds.Email.DATA,

    "[email protected]");
    values.put(ContactsContract.CommonDataKinds.Email.TYPE,

    ContactsContract.CommonDataKinds.Email.TYPE_WORK);

    resolver.insert(ContactsContract.Data.CONTENT_URI, values);

    }

}
时间: 2024-12-12 16:03:18

ContentProvider & ContentResolver的相关文章

ContentProvider ContentResolver ContentObserver 内容:提供、访问、监听

内容提供 public class PersonContentProvider extends ContentProvider{ private static final String AUTHORITY = "com.itheima28.sqlitedemo.providers.PersonContentProvider"; private static final int PRESON_INSERT_CODE = 0; // 操作person表添加的操作的uri匹配码 UriMat

安卓中的数据存储方式以及ContentProvider的简单介绍

1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储 2.请介绍下ContentProvider是如何实现数据共享的 安卓中如果想将自己应用程序的数据暴露给其他的应用程序的时候就需要创建内容提供者.第三方可以通过contentResolver来访问该provider 3.为什么要使用ContentProvider?它和sql的实现上有什么差别? ContentProvider屏蔽了数据

ContentProvider的自定义及SMS和CONTACTS的内容提供者

1.自定义内容提供者 首先创建extends ContentProvider的类 package com.txs.db; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabas

ContentProvider的理解与使用

ContentProvider管理android以结构化方式存放的数据.他以相对安全的方式封装数据并且提供简易的处理机制.Content provider提供不同进程间数据交互的标准化接口. 本文结构: 1.Content Provider简介,Uri简介,使用ContentResolver进行操作 2.开发自己的ContentProvider继承类 3.系统的ContentProvider 4.监听ContentProvider相关的数据变化(ContentObserver类) Content

使用ContentProvider进行应用程序间的数据交互

什么是ContentProvider: ContentProvider用来管理数据的访问规则.它允许你的应用程序向外界暴露需要被访问的数据. 是Android的四大组件之一. ContentProviders支持四种基本的操作,即我们平时所见到的CRUD操作(增删改查).Android系统 本身已经提供了一些内容提供者,它们允许我们查询联系人,媒体库,和短息消息等. 基于Content Uri的查询: 没有Uri,ContentProvider 类基本无法工作,就像我们上网没有网址.当我们要上网

Android 这 13 道 ContentProvider 面试题,你都会了吗?

前言 作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了. 但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体系. 也许大家也有着和我类似的烦恼,于是我特地花了几天的时间,总结了我所知道的知识点,以及面试中可能遇到的问题.将本文分享给大家,希望能帮助大家重新梳理下我们的这个老朋友 ContentProvider . 最后,希望大家阅读愉快! 文章目录 ContentProvider 应用程序间非常通用的共享

CSipSimple配置系统

称作配置系统未免太大了一点,不过它的配置管理这一块确实有加以设计,一方面以增加灵活性,另一方面以支持第三方扩展.通过分析源码,粗略画出如下的结构图: 一.类分析 SharedPreference 一切的基础都是com.csipsimple_preferences.xml这个文件,它存在于app_packagename/shared_prefs文件夹下——它是SharedPerference类型对应的存储文件.里面存储了用户一些配置值,这些值有string.float.boolean.intege

Content Providers的步骤,来自官网文档

Content Providers In this document Content provider basics Querying a content provider Modifying data in a provider Creating a content provider Content URI summary Key classes ContentProvider ContentResolver Cursor Content providers store and retriev

Android四大组件之Content Provider

ContentProvider:内容提供者 1.为存储和读取数据提供了统一的接口 2.使用ContentProvider,应用程序可以实现数据共享 3.android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等) 4.当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据. 先来了解一下Uri: Uri,即通用资源标识符 1.Uri代表要操作的数据,Android上可用的每种资源 -