Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 721|回复: 0

开发交流:Android中ContentProvider组件详解

[复制链接]

该用户从未签到

发表于 2011-10-24 09:32:11 | 显示全部楼层 |阅读模式
ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。
以下这段是Google Doc中对ContentProvider的大致概述。
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。
1.ContentProvider
Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。
主要方法:
public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor
public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。
2.ContentResolver
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。


view plaincopy to clipboardprint?


ContentResolver cr = getContentResolver();  



ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。
public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

3.Uri
Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。
第一部分是"content://"。可以看作是网址中的"http://"。
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.net"。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

下面是用ContentProvider读取联系人数据,属于系统数据。完整代码下载:android_contentprovider_system.rar
注意:这里的联系人操作有点乱,关键是我还不是很熟,SDK1.6和SDK2.1的联系人操作很有很大不同,希望哪位大侠指点一下。

view plaincopy to clipboardprint?


/**
* MainActivity
*
* @author zuolongsnail
*/

public
class MainActivity extends Activity {   
    private EditText nameET;   
    private EditText numberET;   
    private Button insertBtn;   
    private Button deleteBtn;   
    private Button queryBtn;   
    private ListView contentView;   


    @Override

    public
void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        nameET = (EditText) findViewById(R.id.name);   
        numberET = (EditText) findViewById(R.id.number);   
        insertBtn = (Button) findViewById(R.id.insert);   
        deleteBtn = (Button) findViewById(R.id.delete);   
        queryBtn = (Button) findViewById(R.id.query);   
        // 用于显示数据

        contentView = (ListView) findViewById(R.id.content);   
        insertBtn.setOnClickListener(new OperateOnClickListener());   
        deleteBtn.setOnClickListener(new OperateOnClickListener());   
        queryBtn.setOnClickListener(new OperateOnClickListener());   
    }   


    class OperateOnClickListener implements OnClickListener {   
        @Override

        public
void onClick(View v) {   
            String name = nameET.getText().toString();   
            String number = numberET.getText().toString();   
            Person p = new Person(name, number);   
            switch (v.getId()) {   
            // 插入数据

            case R.id.insert:   
                insert(p);   
                view();   
                break;   
            // 删除数据

            case R.id.delete:   
                delete(name);   
                view();   
                break;   
            // 查询数据

            case R.id.query:   
                view();   
                break;   
            }   
        }   
    }   


    // 显示数据

    private
void view() {   
        Cursor c = query("");   
        ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,   
                c, new String[] { People._ID, People.NAME, People.NUMBER },   
                new
int[] { R.id.id, R.id.name, R.id.number });   
        contentView.setAdapter(listAdapter);   
    }   


    // 插入联系人

    private
void insert(Person p) {   
        // 获得ContentResolver对象

        ContentResolver cr = getContentResolver();   
        ContentValues values = new ContentValues();   
        values.put(People.NAME, p.name);   
        // 表示是否把联系人添加到收藏(加星),1表示加入,0表示不加入,这行代码注释默认是不加入。

        values.put(Contacts.People.STARRED, 1);   
        Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);   
        // 获得联系人People表的Uri

        Uri url = Uri.withAppendedPath(uri,   
                Contacts.People.Phones.CONTENT_DIRECTORY);   
        values.clear();   
        values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);   
        values.put(Contacts.Phones.NUMBER, p.number);   
        // 插入操作

        cr.insert(url, values);   
    }   


    // 插入联系人

    private
void delete(String name) {   
        // 获得ContentResolver对象

        ContentResolver cr = getContentResolver();   
        Uri url = Contacts.People.CONTENT_URI;   
        // 设置删除条件

        String where = People.NAME + "=?";   
        String[] selectionArgs = { name };   
        cr.delete(url, where, selectionArgs);   
    }   


    // 查询联系人

    private Cursor query(String name) {   
        // 获得ContentResolver对象

        ContentResolver cr = getContentResolver();   
        Uri uri = Contacts.People.CONTENT_URI;   
        // 查询对象

        String[] projection = { People._ID, People.NAME, People.NUMBER };   
        // 设置查询条件,这里我把selection和selectionArgs参数都设为null,表示查询全部数据

        String selection = null;   
        String[] selectionArgs = null;   
        if (!"".equals(name)) {   
            selection = People.NAME + "=?";   
            selectionArgs = new String[] { name };   
        }   
        // 设置排序条件

        String sortOrder = Contacts.People._ID;   
        Cursor c = cr.query(uri, projection, selection, selectionArgs,   
                sortOrder);   
        // if (c.moveToFirst()) {

        // for (int i = 0; i < c.getCount(); i++) {

        // c.moveToPosition(i);

        // String name = c.getString(c.getColumnIndexOrThrow(People.NAME));

        // String number = c.getString(c

        // .getColumnIndexOrThrow(People.NUMBER));

        // }

        // }

        return c;   
    }   
}  
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:32:14 | 显示全部楼层

Re:开发交

沙发~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:32:17 | 显示全部楼层

Re:开发交

感谢分享、..
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:32:19 | 显示全部楼层

Re:开发交

刚好要看看谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 22:02 , Processed in 0.382266 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表