1.获取联系人姓名

一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME。

public void fetchAllContacts() {ContentResolver contentResolver = this.getContentResolver();Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null);cursor.getCount();while(cursor.moveToNext()) {System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)));System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)));}cursor.close();}

执行结果:

11-05 14:13:09.987: I/System.out(4692): 1311-05 14:13:09.987: I/System.out(4692): 张三11-05 14:13:09.987: I/System.out(4692): 3111-05 14:13:09.987: I/System.out(4692): 李四

解释:

ContentResolver contentResolver = this.getContentResolver();

this在这里指的是MainActivity,ContentResolver直译为内容解析器,什么东东?Android中程序间数据的共享是通过Provider/Resolver进行的。提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。

在这里,系统提供了联系人的Provider,那么我们就需要构建一个Resolver来读取联系人的内容。

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
根据Android文档,

public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)

第一个参数,uri,rui是什么呢?好吧,上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?有提供联系人的,有提供图片的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri就是这个标识,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者,可惜这个内容提供者提供的数据很少。

第二个参数,projection,真不知道为什么要用这个单词,这个参数告诉Provider要返回的内容(列Column),比如Contacts Provider提供了联系人的ID和联系人的NAME等内容,如果我们只需要NAME,那么我们就应该使用:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);
当然,下面打印的你就只能显示NAME了,因为你返回的结果不包含ID。用null表示返回Provider的所有内容(列Column)。

第三个参数,selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。如果我们只想返回名称为张三的数据,第三个参数应该设置为:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='张三'", null, null);
结果:

11-05 15:30:32.188: I/System.out(10271): 张三
第四个参数,selectionArgs,这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?,那么你在selectionArgs写的数据就会替换掉?,

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?",new String[]{"张三"}, null);

效果和上面一句的效果一样。

第五个参数,sortOrder,按照什么进行排序,相当于SQL语句中的Order by。如果想要结果按照ID的降序排列:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null,null, android.provider.ContactsContract.Contacts._ID + " DESC");
结果:

11-05 16:00:32.808: I/System.out(12523): 3111-05 16:00:32.808: I/System.out(12523): 李四11-05 16:00:32.817: I/System.out(12523): 1311-05 16:00:32.817: I/System.out(12523): 张三
升序,其实默认排序是升序,+" ASC"写不写效果都一样:

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC");
结果:

11-05 15:59:10.327: I/System.out(12406): 1311-05 15:59:10.327: I/System.out(12406): 张三11-05 15:59:10.327: I/System.out(12406): 3111-05 15:59:10.327: I/System.out(12406): 李四

好了,终于搞定第一篇了,自己鼓励一下!

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Python技巧匿名函数、回调函数和高阶函数
  3. python list.sort()根据多个关键字排序的方法实现
  4. attrs.xml的使用
  5. Android(安卓)notification点击跳转到Activity,点击返回跳转,前一
  6. Android(安卓)获取系统设置参数。
  7. 几个通用的类,迷你型的Android下载框架
  8. Android查询短信数据库
  9. Android中getSystemService详解

随机推荐

  1. Android 深入解析光传感器
  2. android box2d小程序
  3. android 获取Bitmap 的两种方法
  4. Android Studio下导出jar包和aar包
  5. android导入第三方包(解决ClassNotFound错
  6. Android的蓝牙实例代码中找不到REQUEST_E
  7. [Android NDK]Android JNI开发例子 ---2
  8. 【Android】进入应用和切换界面时闪屏的
  9. 总结Android中的Info系列类
  10. Android简单模糊背景和圆形ImageView