您的位置:首页 > 移动开发 > Android开发

Android四大组件之ContentProvider

2017-03-29 21:25 393 查看


ContentProvider适用场景:

1) ContentProvider为存储和读取数据提供了统一的接口。

2) 使用ContentProvider,应用程序可以实现数据共享。

3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。

如何实现ContentProvider?

1.继承抽象类ContentProvider实现一系列针对于数据的增、删、改、查等方法;

2.需要在AndroidMainfest.xml中完成对ContentProvider的注册。

何为Uri?

Uri是指通用资源标识符

      content://com.example.provider/music/#

第一段:前缀表明数据受控于一个内容提供者。它从不修改,也就是schema

第二段:是指在AndroidMainfest.xml中我们注册的Provider中的android:authorities属性所对应的

第三段:具体操作于哪个条目

第四段:具体指定到哪个条目下的哪条记录(#表示通配符)

ContentResolver:

  使用ContentResolver操作ContentProvider中的数据:

1.当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成

2.使用Activity提供的getContentResolver()方法获取ContentResolver对象

3.ContentResolver类提供了与ContentProvider类相同签名的四个方法



看下列代码展示:

ContentResolver cr=getContentResolver();
Cursor c=cr.query(Contacts.CONTENT_URI, new String[]{Contacts._ID,Contacts.DISPLAY_NAME}, null,null, null);
if(c!=null)
{
while(c.moveToNext())
{
int id=c.getInt(c.getColumnIndex("_id"));
Log.i("info", "_id:"+id);
Log.i("info", "name:"+c.getString(c.getColumnIndex("display_name")));
Cursor c1=cr.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER,Phone.TYPE}, Phone.CONTACT_ID+"="+id, null, null);
//根据联系人ID查询出联系人的电话号码
if(c1!=null)
{
while(c1.moveToNext())
{
int type=c1.getInt(c1.getColumnIndex(Phone.TYPE));
if(type==Phone.TYPE_HOME)
{
Log.i("info", "家庭电话:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
}
else {
Log.i("info", "手机:"+c1.getString(c1.getColumnIndex(Phone.NUMBER)));
}
}
c1.close();
}
//根据联系人的ID去查询出联系人的邮箱
Cursor c2=cr.query(Email.CONTENT_URI, new String[]{Email.DATA,Email.TYPE}, Email.CONTACT_ID+"="+id, null, null);
if (c2!=null) {
while (c2.moveToNext()) {
int type=c2.getInt(c2.getColumnIndex(Email.TYPE));
if (type==Email.TYPE_WORK) {
Log.i("info", "工作邮箱:"+c2.getString(c2.getColumnIndex(Email.DATA)));
}
}
c2.close();
}
}
c.close();
}

需要注意的地方都用红色标记出来了。
还有一个注意的地方就是设置访问权限:



自己先在通讯录里创建两个联系人:如Jim和张三





运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ContentProvider