Android 四大组件学习之ContentProvider四

上节我们学习了怎样去读取系统短信以及插入一条短信到系统中。 本节我们学习怎样获取系统的联系人,以及插入一条联系人

好。废话不多说了,直接操作。

首先和读取短信一样,先找到联系人在数据库中的位置。

然后导出,查看数据库中的内容

上图就是怎样到数据库中找打系统的联系人数据,(看起来图画的有点乱,希望能看懂吧)

既然知道怎样能到系统的数据库找到数据。那我们就開始写代码实现吧:

public class ReadContactActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_readcontact);

	}

	public void readContact(View v)
	{
		ContentResolver cr = getContentResolver();

		/*
		 * 先到raw_contacts表中拿到contact_id
		 * content://com.android.contacts/raw_contacts是raw_contacts的訪问url
		 * */
		Cursor contactId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
		while(contactId.moveToNext())
		{
			/*
			 * 拿到contact_id接着到data表中去依据raw_contact_id获取mimetype_id和data1数据
			 * */
			String id = contactId.getString(contactId.getColumnIndex("contact_id"));

			/**
			 * "content://com.android.contacts/data"是訪问data表的url
			 * 通过id也就是contact_id去data表中找,data1, raw_contact_id, mimetype_id.
			 * 可是, id就是raw_contact_id,所以就不用再找了。

而mimetype_id因为Android系统为我们自己优化了一些细节。当你在data表中找mimetype_id是找不到的
			 * android系统直接将mimetype_id转变为找mimetype了
			 */
			Cursor contactData = cr.query(Uri.parse("content://com.android.contacts/data"),
					new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{id}, null);
			String email = null, phone = null, name = null;
			while(contactData.moveToNext())
			{
				String data1 = contactData.getString(contactData.getColumnIndex("data1"));
				String mimetype = contactData.getString(contactData.getColumnIndex("mimetype"));

				/*假设mimetype是邮箱*/
				if("vnd.android.cursor.item/email_v2".equals(mimetype))
				{
					email = data1;
				}//假设mimetype是电话
				else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
					phone = data1;
				}//假设mimetype是名字
				else if  ("vnd.android.cursor.item/name".equals(mimetype)){
					name = data1;
				}
			}

			Log.i("ReadContactActivity", id + ‘;‘ + name + ";" + phone + ";" + email);
		}
	}
}

打印结果为:

上图就是怎样获取联系人的操作。

注意: 读取联系人,短信等信息都须要加上权限的:

既然知道怎样从系统中获取联系人。那就应该会为系统插入一条联系人的记录。

接下来我们实现为系统插入一条联系人记录

Activity的插入的代码:

public void insertContact(View v)
	{
		ContentResolver cr = getContentResolver();
		Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"_id"}, null, null, null);
		/*假设数据库中没有数据,则插入的就是第一条数据*/
		int contactId = 1;
		if(cursor.moveToLast())
		{
			/*假设有数据,就插入到最新的写一条*/
			int id = cursor.getInt(cursor.getColumnIndex("_id"));
			contactId = id + 1;
		}

		ContentValues values = new ContentValues();
		/*将新的id插入到raw_contacts表中*/
		values.put("contact_id", contactId);
		cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);

		/*插入名字*/
		values.clear();
		values.put("data1", "erlangsheng");
		values.put("mimetype", "vnd.android.cursor.item/name");
		values.put("raw_contact_id", contactId);
		cr.insert(Uri.parse("content://com.android.contacts/data"), values);

		/*插入电话*/
		values.clear();
		values.put("data1", "00189890");
		values.put("mimetype", "vnd.android.cursor.item/phone_v2");
		values.put("raw_contact_id", contactId);
		cr.insert(Uri.parse("content://com.android.contacts/data"), values);	

	}
}

结果为:

以上就是给联系人插入一条记录。

时间: 2024-09-28 20:35:43

Android 四大组件学习之ContentProvider四的相关文章

Android 四大组件学习之ContentProvider一

ContentProvider作为四大组件之一,那它存在一定是有原因的? 那为什么引用ContentProvider呢?  我们先看一个例子. 大家在生活中用手机,比如你按了360手机管家, 其中360手机管家就有一个短信,通话记录,联系人备份的功能.那手机里的短信,联系人都是存放在数据库中的 比如联系人的信息是存放在contacts2.db中.既然数据是存放在数据库中的,那360手机管家就必须拿到这个数据.但是contac2.db对别的用户是没有权限的.那360是如何拿到手机联系人这些信息呢?

Android 四大组件学习之ContentProvider五

上几节学习了ContentProvider的实际用途,读取短信,插入短信,读取联系人,插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件,比如什么短信软件,此短信软件是替代了系统中自带的短信软件.当然可读取短信就是利用的ContentProvider,但是此等软件为何能实时的把接受的短信显示出来呢?  这就用到我们的内容观察者. 什么是内容观察者呢?  就是一直在观察系统是否有新短信,如果有新短信就会提示第三方软件赶快去数据库中取短信信息.这样就能实时的

Android 四大组件学习之ContentProvider二

上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是检验真理的唯一标准. 那我们就開始行动吧 第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider public class MyContentProvider extends ContentProvider { @Override public int d

Android 四大组件学习之ContentProvider三

上节课学习如何自己创建一个ContentProvider,以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的,读取系统的短信内容. 根据上节知道,既然要读取系统的短信,那就得先找到系统的短信在那里? 先找到短信数据库所在的问题,然后导出,查看里面的内容 既然已经分析好了,我们需要什么,不需要什么. 当然还需要知道短信提供者给第三方的URL.这个可以通过Android源码查看. 那我们就写一个程序,读取系统

Android 四大组件学习之BroadcastReceiver四

本节学习系统中特殊的广播接收者. 我们前面几节不是说了,当广播接受者一旦注册到系统中,当系统发送的广播和你注册的广播的action匹配时,系统就会启动广播接收者所在的进程.除非用户手动停止广播接收者所在的进程.但是生活中有这样一种情况,比如说:我在玩网络游戏,假设说游戏本身在系统电量低的情况下,会自动保存当前游戏的进度,也就是存档的.可以这么说,此广播接受者只有在用户玩游戏时才需要启动,别的时候用户是不需要的.如果此广播接收者一直常驻于系统,那不是很浪费系统资源.所以我们就需要动态的启动广播接收

Android 四大组件学习之Service四

本节学习Service的生命周期. 既然Activity有生命周期,那同理Service也有自己的生命周期. 和学习Activity一样,我们先贴出Google官网给Service下的定义,以及生命周期图 从图中可以看到,左面一路下来是我们第二节课中说的用StartServer启动服务的流程.右面一路下来的是第三节中说的用BindService启动服务的流程. 在上两节中都看到了如何启动服务,同时销毁服务.既然这年代是混搭的年代,那当然也需要这两种服务混搭起来使用. 先来看看MyActivity

android四大组件学习总结以及各个组件示例(1)

android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity生命周期>什么是

Android 四大组件学习之Activity一

Activity是Android四大组件中最基础也是最常用的组件之一.Activity作为一个应用程序组件,提供了一个与用户交互的界面.可以这么说Activity是和用户操作有密切相关的的,常用来负责与用户交互,可以通过setContentView来显示组件. 今天我们学习如何去创建一个Activity 第一步: 创建一个Android Application Project, 填入应用名称,工程名称,包名 点击Next下一步:下面的选择都是默认的. 直到 你就可以选择一个Activity进行创

Android 四大组件学习之BroadcastReceiver一

本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比如在现实社会中,以前每个人家都有一台收音机,这可就可以去接受广播发出来的消息.大家都知道,程序世界也是参照的显示生活设计出来的,那在Android系统中也引入了广播这个概念.那在Android系统中广播有什么作用呢? 举个例子:比如你正在玩游戏或者看视频突然手机电量过低,这时候就会弹出一个框,提醒您手机电量过低,请充电的提示.其实电量改变就是一种广播类型,当电量过低时,系统就会发生一条广播,这时候正在运行的程序就会收