Android开发之ContentProvider对联系人操作
来源:互联网 发布:淘宝开店店名 编辑:程序博客网 时间:2024/04/29 11:47
继续学习Android中,感觉好痛苦!!!有时候学习劲头很旺,有时候又想去他大爷的好烦呀,天天的看呀学呀的。搞技术都这么苦逼,不断去学习了解新的知识,恐怕自己的知识不够多,在这大城市被淘太了。不过再痛苦也要坚持,为了美好的明天,加油加油!
话不多说了进入今天的主题:使用contentprovider 对联系人进行操作
这里就只贴出一些主要的代码加上注解,就不做界面的展示了!
其实ContentProvider对联系人的操作无非就是,添加、删除、修改、查询,Android系统中的联系人信息不是全部存放在一张中的,而是分多张表存放的。
content://com.android.contacts/contacts 这个路径是对应的联系人的id表(raw_contacts)
content://com.android.contacts/contacts/#/data 这个路径则是根椐联系人的id获取联系人具体信息的表(data)
两张表是一对多的关系
还有一张表是(mimetypes)表里边存放的是data表中每条记录内容对应的类型,比如手机号、或者是邮箱等。联系人操作最常用就是这三个不表
/** * 根椐contentprovider 获取系统内部的联系人 */ public void getContants(View v) { // 这个路径是获取所有联系人的id Uri uri = Uri.parse("content://com.android.contacts/contacts"); ContentResolver resolver = this.getContentResolver(); //查询出这个raw_contacts中所有的联系人id Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null,null); //循环得到id while (cursor.moveToNext()) { int contacts_id = cursor.getInt(0); StringBuffer buf = new StringBuffer("contactsid="); buf.append(contacts_id); //再根据联系人的id去查询具体的信息(如联系方式等) uri = Uri.parse("content://com.android.contacts/contacts/"+ contacts_id + "/data"); //这里需要说明下data1字段存放的就是电话号、或者邮箱等信息 Cursor datacursor = resolver.query(uri, new String[] { "mimetype","data1", "data2" }, null, null, null); while (datacursor.moveToNext()) { String type = datacursor.getString(datacursor.getColumnIndex("mimetype")); String data = datacursor.getString(datacursor.getColumnIndex("data1")); //如果记录的类型是姓名和手机号打印出来 if ("vnd.android.cursor.item/name".equals(type)) { Log.i("xinzhifu", data); } else if ("vnd.android.cursor.item/phone_v2".equals(type)) { Log.i("xinzhifu", data); } } } }//其实想想和web开发是对数据操作一样的简单//接下来我们根据手机号查询某个指定的联系人/** * 这里我们根椐手机号码去查询出联系人信息 */ public void getInfoByPhoneNum(){ String numner = "15981480726"; //这个是路径根椐手机号码去查询出联系人信息 Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+numner); ContentResolver resolver = this.getContentResolver(); //这里只是获取了联系人姓名 Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null); if(cursor.moveToFirst()){ String name = cursor.getString(0); Log.i("xinzhifu", name); } cursor.close(); }
接下来是插入联系人信息(这是个需要特别注意的下个操作)
插入联系人的操作流程是:
1.在raw_contacts表中插入一条记录获取返回的一个主键id,然后在在data表中插入相关的基础信息把id作为data表中的一个外键。但是值得注意的是每次insert都是单独的一次操作,如果后边的插入操作出错而前边的操作成功那么那就导致出错,所以要保证所有操作同时成功或者同时失败,这就需要用到了ContentProvider的事务管理。
/* 根椐contentprovider 添加联系人 * 这种是逐一执行插入操作 */ public void insetContact() { Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = this.getContentResolver(); ContentValues values = new ContentValues(); long contactsid =ContentUris.parseId(resolver.insert(uri, values)) ; Log.i("xinzhifu", "contactsid"+contactsid); uri = Uri.parse("content://com.android.contacts/data"); values.put("raw_contacts_id", contactsid); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data2", "测试君"); resolver.insert(uri, values); values.clear(); values.put("raw_contacts_id", contactsid); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data2", "2"); values.put("data1", "123456789"); resolver.insert(uri, values); }但是这种方式不好控制,所以我们要用事务的方式。代码如下:/***这种方法将所有的操作放入一个list中进行逐一操作,实现事务**/public void insetContact() throws RemoteException, OperationApplicationException { Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = this.getContentResolver(); //定义存放数据操作的list ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); //创建一个操作 ContentProviderOperation operation1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null) .build(); operations.add(operation1); uri = Uri.parse("content://com.android.contacts/data"); /** 值得说明一下的是 withValueBackReference("字段名",0)这个方法的意思是:这个插入操作的 raw_contacts_id 字段的值为ArrayList<ContentProviderOperation> 中游标为 “0”的插入操作执行后的返回值,也就是返回的主键id*/ ContentProviderOperation operation2 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contacts_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "测试君") .build(); operations.add(operation2); ContentProviderOperation operation3 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contacts_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data2", "2") .withValue("data1", "123456789") .build(); operations.add(operation3); /**最后提交插入操作 大致事务操作: begin() dosomething() end() */ resolver.applyBatch("com.android.contacts", operations); }
- Android开发之ContentProvider对联系人操作
- Android ContentProvider之联系人数据库及操作
- Android--操作联系人的ContentProvider
- Android开发之联系人操作
- Android开发之联系人操作
- Android ContentProvider(类容提供者)之操作通讯录联系人 添加查询联系人
- Android ContentProvider 之查看/读取手机联系人
- Android -ContentProvider之获取手机联系人
- Android ContentProvider之读取、添加联系人
- Android之联系人操作
- Android开发之contentprovider获取手机所有联系人(姓名、号码、邮箱)
- Android开发之ContentProvider
- Android开发之ContentProvider
- ContentProvider之读写联系人
- android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作
- android 玩转ContentProvider之三--实现一个ContentProvider对多张表进行操作
- android 玩转ContentProvider之二--实现多个ContentProvider对多张表进行操作
- Android软件开发之获取通讯录联系人信息 + android联系人信息的存储结构 + Android联系人读取操作笔记
- Android:从入门到改行
- Mac下安装配置Tomcat
- 前端开发者必备的20个文档和在线工具
- 13.进程间通信---网络通信(TCP协议和UDP协议的比较)
- Django 学习小组:博客开发实战第一周教程 —— 编写博客的 Model 与首页面
- Android开发之ContentProvider对联系人操作
- c#——窗体实验-最初版
- [单调队列] BZOJ 1071 [SCOI2007]组队
- Akka/play(activator)2.5.3 创建工程 3
- jQuery实战学习笔记(三)--事件处理
- URL Protocol实现网页调用本地应用程序
- 模式识别(Pattern Recognition)学习笔记(十)--最小平方误差判别(MSE)
- 杂记-5.20-关于大数据的一点构想
- Struts2 过滤器无法正常过滤.action请求