ContentProvider浅谈+实例

作为安卓四大组件之一,ContentProvider的用处也不少,ContentProvider用于保存和检索数据,是安卓系统中不同应用程序之间共享数据的接口。

最直观的应用就是当你发送短信时需要用到联系人的相关信息,此时通过ContentProvider提供的接口访问Android系统中的电话簿,并从中选中了联系人。

Android系统对一系列公共的常用数据类型提供了对应的ContentProvider接口,都定义在android.provider包下。

ContentProvider实现共享数据:ContentProvider提供了一组应用程序之间能访问的接口,应用程序通过ContentProvider把当前应用中的数据共享给其他应用程序访问,二其他应用程序也可以通过ContentProvider对指定的应用程序进行访问。将自己的数据公开给其他应用使用有2种方法,1.定义自己的ContentProvider子类,2.将当前应用的数据添加到已有的ContentProvider中。

下面是一个用ContentProvider访问手机联系人的例子。

MainActivity代码:

public class MainActivity extends Activity {

private String[] columns={Contacts._ID,

Contacts.DISPLAY_NAME,

Phone.NUMBER,

Phone.CONTACT_ID

};

private ListView listview;

private Dialog dialog;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listview=(ListView)findViewById(R.id.list1);

dialog=new Dialog(MainActivity.this);

dialog.setTitle("电话");

dialog.setContentView(R.layout.content_dialog);

dialog.setCanceledOnTouchOutside(true);

showinfo();

listview.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

dialog.show();

}

});

}

private void showinfo(){

ArrayList<HashMap<String ,String>> list=new ArrayList<HashMap<String, String>>();

ContentResolver resolver=getContentResolver();

Cursor cursor=resolver.query(Contacts.CONTENT_URI, null,null,null,null);

while(cursor.moveToNext()){

HashMap<String,String> map=new HashMap<String, String>();

String liststr="";

int idindex=cursor.getColumnIndex(columns[0]);

int nameindex=cursor.getColumnIndex(columns[1]);

int id=cursor.getInt(idindex);

String name=cursor.getString(nameindex);

Cursor phone=resolver.query(Phone.CONTENT_URI, null,columns[3]+"="+id,null,null);

while(phone.moveToNext()){

int phonenumberindex=phone.getColumnIndex(columns[2]);

String phonenumber=phone.getString(phonenumberindex);

liststr+=phonenumber;

}

map.put("name", name);

map.put("phonenumber", liststr);

list.add(map);

}

cursor.close();

SimpleAdapter simpleAdapter=new SimpleAdapter(this, list, R.layout.simple_adapter_item, new String[]{"name","phonenumber"}, new int[]{R.id.row_text1,R.id.row_text2});

listview.setAdapter(simpleAdapter);

}

}

这段主要代码中,Dialog是一个点击联系人即可出现的一个悬浮对话框,即红色部分。

联系人列表主要是showinfo()方法,即蓝色部分,ListView中用的是SimpleAdapter适配。

对应的Xml文件比较简单,在这里也给出:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<ListView

android:id="@+id/list1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:scrollbarAlwaysDrawVerticalTrack="true">

</ListView>

</RelativeLayout>

content_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="--电话号码--"/>

</LinearLayout>

simple_adapter_item.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/row_text1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="--------"

/>

<TextView

android:id="@+id/row_text2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="--------"

/>

</LinearLayout>

同时,需要进行权限设置,在AndroidMainfest.xml里,

<uses-permission android:name="android.permission.READ_CONTACTS"/>

这样就ok了,可以访问系统的电话簿了。

时间: 2024-11-10 16:18:56

ContentProvider浅谈+实例的相关文章

浅谈Spring(四)AOP实例

在<浅谈Spring(三)AOP原理>中我详细的介绍了AOP的基本概念和实现原理,这里给出代码示例. 一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class TestAspect { public void doAfter(JoinPoint jp) { System

浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)

来自:http://blog.csdn.net/zhdwjie/article/details/1490741 ------------------------------------------------------------------- 从99年学习delphi开始,我就被它的快速开发迷上了,那时候刚接触编程,对可视化开发特别来劲,原因嘛,不外乎是比C更快的实现啦,这几年来,从delphi的C/S到三层B/S,大大小小也写过一些软件,自认为这delphi也就这么些功能吧,自从最近偶得一

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈结对编程

浅谈结对编程 结对编程 结对编程,是一种敏捷软件开发的方法,极限编程的组成部分.结对编程技术是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计.同一个算法.同一段代码或同一组测试.一人充当“执行”角色,只负责编程.另外则负责“观察者”(或“导航”),检测bug和把控整体设计.两个程序员具有相同的缺点和盲点的可能性很小,所以当我们采用结对编程的时候会获得一个强大的解决方案.而这个解决方案恰恰是其它软件工程方法学中所没有的. 由于自己长时间都习惯了一个人编程,所以在这次结对编程的初期在做项目的

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

java serialize 浅谈

对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串

浅谈三层架构(2)

感受: 对于三层的学习,自己刚开始的感觉真的是一头雾水啊,当时真的出现了很烦躁的感觉,我想这种感觉的出现真的是很可怕的,就这样耽误了两天,在网上也搜寻者自己想要的资料,昨天四姐也好心给调试了一番,顿时把自己的大脑打通了,其实问题难不难,就在于能不能打开思路了! VB.NET的三层实现: 上篇文章主要是对于三层有了一个表面的理解,下面针对机房收费登陆界面来进行一下简单的理解: UI层主要就是表面的构建,多以需要使用windows窗体来完成,而其他BLL和DAL则不需要,之间建立一个类库则可以完成自

浅谈自然语言处理基础(下)

命名实体识别 命名实体的提出源自信息抽取问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,而人名.地名.组织机构名.时间和数字表达式结构化信息的关键内容,所以需要从文本中去识别这些实体指称及其类别,即命名实体识别和分类. 21世纪以后,基于大规模语料库的统计方法成为自然语言处理的主流,以下是基于统计模型的命名实体识别方法归纳: 基于CRF的命名实体识别方法 基于CRF的命名实体识别方法简便易行,而且可以获得较好的性能,广泛地应用于人名.地名和组织机构等各种类型命名实体的识