`

关于系统提供的ContentResolver无法进行distinct查询

 
阅读更多

今天下午需要实现一个东西是:获取出系统联系人数据库中的raw_contact_id,使用系统提供的ContentResolver进行查询,但是一直报错,后来google了一下,发现原来在这里面是无法使用distinct的。不知道为什么。也不知道那些贴代码出来的人是怎么办到的。后来参考了一篇博文,问题算是得到解决了

 

Cursor cursor2 = context.getContentResolver().query(
				Data.CONTENT_URI,
				new String[]{  Data.RAW_CONTACT_ID },
				"  1=1 ", 
				null,
				null);

 先查出所有的raw_contact_id

 

再利用HashSet的特性,因为向HashSet中添加记录的时候,默认会将相同的去除

这样就相当于distinct的效果啦。

 

 

HashSet<Integer> hashSet = new HashSet<Integer>();
		
		while(cursor2.moveToNext())
		{
			hashSet.add(cursor2.getInt(cursor2.getColumnIndex(Data.RAW_CONTACT_ID)));
		}
		System.out.println("hashSet:count:" + hashSet.size());

 

 

参考链接:http://www.oschina.net/question/163910_27486

 

 

 

但是这样做还是有问题,因为HashSet的访问需要使用迭代器,而我不希望所得到的数据通过迭代器来处理,因此,还可以这样处理:

while(cursorOfSys.moveToNext())
		{
			int currRawContactId = cursorOfSys.getInt(cursorOfSys.getColumnIndex(Data.RAW_CONTACT_ID));
			if(listOfSysRaw.isEmpty())
			{
				listOfSysRaw.add(currRawContactId);
			}
			else
			{
				int sizeOfSysRaw = listOfSysRaw.size();
				System.out.println("currRawContactId:" + currRawContactId + "sizeOfSysRaw:" + sizeOfSysRaw);
				boolean isExist =false;
				for(int i = 0; i < sizeOfSysRaw; i++)
				{
					if(listOfSysRaw.get(i) == currRawContactId)//如果不存在这个值
					{
						isExist = true;
						break;
					}
				}
				if(!isExist)
				{
					listOfSysRaw.add(currRawContactId);//添加到数组里面
				}
			}
		 }
 

 

 

 

 

 

 

分享到:
评论
2 楼 michaelye1988 2012-08-06  
zhou405680603 写道
ContentResolver是可以进行distinct查询的,还可以进行外键查询。其实query方法里面也是根据参数拼接SQL语句。只要在参数上面做点手脚就可以。第二个参数new String[]{“distinct ”+Data.RAW_CONTACT_ID}, 就可以,今天亲自测试了

一定要注意distinct后面要加个空格

谢谢你的指教,我找个时间测试下。谢谢
1 楼 zhou405680603 2012-07-17  
ContentResolver是可以进行distinct查询的,还可以进行外键查询。其实query方法里面也是根据参数拼接SQL语句。只要在参数上面做点手脚就可以。第二个参数new String[]{“distinct ”+Data.RAW_CONTACT_ID}, 就可以,今天亲自测试了

一定要注意distinct后面要加个空格

相关推荐

    ContentResolver

    在Android开发中,ContentResolver是Android系统提供的一种接口,它为应用程序提供了与ContentProvider进行交互的能力。ContentProvider作为Android四大组件之一(Activity、Service、BroadcastReceiver、...

    Android开发ContentResolver与ContentProvider的使用

    ContentResolver是Android框架提供的一个接口,它为应用程序提供了一个统一的接口,用来与ContentProvider进行交互。开发者可以通过ContentResolver查询、插入、更新或删除ContentProvider中的数据,而无需了解具体...

    ContentProvider和ContentResolver

    开发者通过ContentProvider暴露数据,而其他应用则通过ContentResolver进行访问,这种方式不仅提高了代码的可复用性,也促进了Android生态系统的互操作性。在进行跨应用数据交互时,理解并熟练掌握这两者至关重要。

    ContentResolver_Contacts_Demo

    在Android开发中,`ContentResolver` 是一个非常重要的组件,它负责与系统的内容提供者(Content Provider)进行交互,从而获取或修改系统中的数据。在这个"ContentResolver_Contacts_Demo"示例中,我们将深入探讨...

    ContentResolver使用场景

    ContentResolver是Android系统中用于在应用程序之间进行数据交互的重要工具,它提供了统一的接口,使得应用程序可以方便地访问和操作其他应用或系统服务提供的数据,如联系人、日历、多媒体文件等。在这个实验中,...

    编程实现ContentResolver对系统中所有联系人的访问

    设计App通过ContentResolver的使用场景,访问系统中所有联系人并将其以列表形式展示出来,长按联系人姓名会弹出菜单显示添加、删除、排号等相关操作,选择菜单执行相关操作,如选择删除将删除选中的联系人,选择拔号...

    android ContentResolver的使用(获取和修改联系人信息demo)

    ContentProvider和ContentResolver永远是相对的,本章主要是讲ContentResolver的使用,当然是在android系统提供ContentProvider的情况下。 ContentProvider与ContentResolver概念上的东西的就不讲了,主要讲一下...

    Android中ContentResolver的使用说明.pdf

    ContentResolver提供了标准化的API,允许开发者无需关心数据的具体存储方式,无论是数据库、文件系统还是网络,只要ContentProvider实现了相应的接口,就可以通过ContentResolver进行操作。 首先,了解URI(Uniform...

    利用contentprovider和ContentResolver获取手机联系人信息

    ContentProvider是Android中用于数据共享和跨应用数据访问的机制,而ContentResolver则是应用程序与ContentProvider进行交互的接口。下面我们将深入探讨如何利用这两个组件来获取手机中的联系人信息。 首先,理解...

    ContentProvider获取系统的图片视频和音频

    本篇文章将详细讲解如何使用ContentProvider通过ContentResolver来获取系统的图片、视频和音频资源。 一、ContentProvider基础 ContentProvider是Android提供的一种统一的数据访问接口,它封装了对数据的操作,包括...

    安卓ContentResolver操作通讯录demo

    在安卓开发中,ContentResolver是Android系统提供的一种接口,用于与内容提供者(Content Provider)进行交互,从而访问和管理应用程序的数据,如联系人、日历等。本项目"安卓ContentResolver操作通讯录demo"是一个...

    利用contentprovider和contentresolver执行对数据库的增删改查操作,

    在Android系统中,ContentProvider和ContentResolver是两个关键组件,它们为应用程序间的共享数据提供了统一的接口。在Android开发中,如果我们需要对数据库进行增、删、改、查(CRUD)操作,这两个组件就显得尤为...

    android程序间数据的共享(ContentProvider和ContentResolver的使用)

    在Android系统中,应用程序之间进行数据共享是一种常见的需求。为了实现这一目标,Android提供了一种安全、标准化的方式,即通过ContentProvider和ContentResolver组件。本文将深入探讨这两个组件的工作原理及其在...

    android文本/图片切换,contentresolver,抽屉,评级,scroll,bitmap使用

    2. **ContentResolver**:ContentResolver是Android系统中的一个接口,它允许应用程序与其他应用程序的数据进行交互,尤其是与ContentProvider相关的数据。例如,读取和写入联系人、媒体文件等。通过URI(统一资源...

    Android应用程序之间数据共享ContentResolver.pdf

    ContentResolver 是 Android 中一个非常重要的组件,它提供了一个统一的接口来访问和操作共享数据。 在 Android 中,应用程序之间数据共享可以通过 ContentProvider 来实现。ContentProvider 是一个抽象接口,它...

    自定义内容提供者和调用系统联系人

    接下来,调用系统联系人数据通常涉及到使用系统的ContactsContract类,这是Android提供的一个接口,用于与系统联系人数据进行交互。调用步骤如下: 1. 获取ContentResolver:在Activity或Service中,通过`...

    android 自定义 ContentProvider 以及 ContentResolver

    在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...

    ContentResolverDemo,安卓.zip

    1. **ContentResolver 概念**:`ContentResolver` 是 Android 系统提供的一个接口,它允许应用通过统一的方式与各种数据源(如 SQLite 数据库、文件系统、网络资源等)进行通信,无需关心底层实现细节。 2. **...

    ContentProvider与ContentResolver与SQLiteOpenHelper

    ContentProvider与ContentResolver 与 SQLiteOpenHelper http://blog.csdn.net/i_do_can/article/details/50937380 http://blog.csdn.net/i_do_can/article/details/50937380

Global site tag (gtag.js) - Google Analytics