`

在Android中自由查询系统联系人数据库的一次实践

阅读更多

  实践来源于下面的想法:

   在调用

   getContentResolver().query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

   时,是否可以在系统构造的查询语句中,为等待查询的表使用一个别名。

 

   通过Google查找后,发现下面两个web:

   1.android 自由操作系统数据库

   2.android 中管理短信

   其中提供的方法是:在方法query的参数projection中,使用注释符,将系统拼凑的内容注释掉;而自己的语句全都放在了参数

projection中。下面是一段来自1)的例子:

   select * from sms as a join threads as b where a._id = 1 order by a.date desc– from sms where () order by date desc
   相应的query方法为
  getContentResolver().query( Uri.parse("content://sms/") , new String[]{"* from sms as a join threads as b where a._id = 1 order by a.date desc--"}, null, null, null)

   按照这个思路,首先测试了提供的例子,成功后在系统联系人数据库查询中使用此方法实现之前的想法,但是产生错误。日志信息类似下面:

    Caused by: java.lang.IllegalArgumentException: Invalid column ......


    原因在哪里?

    下面这个web中,作者为‘DMH‘的回答,可以解释这个错误的原因。

     IllegalArgumentException: Invalid column

    回头查看logcat日志输出,依次查看了Android的源码:

    com.android.providers.contacts.ContactsProvider2

    android.database.sqlite.SQLiteQueryBuilder

    之后明白了其中的原因。

    在com.android.providers.contacts.ContactsProvider2中构建查询时,使用下面的代码:

   

qb.setStrictProjectionMap(true);

    而在android.database.sqlite.SQLiteQueryBuilder的方法computeProjection中,有如下代码:

   

for (int i = 0; i < length; i++) {
                    String userColumn = projectionIn[i];
                    String column = mProjectionMap.get(userColumn);

                    if (column != null) {
                        projection[i] = column;
                        continue;
                    }

                    if (!mStrictProjectionMap &&
                            ( userColumn.contains(" AS ") || userColumn.contains(" as "))) {
                        /* A column alias already exist */
                        projection[i] = userColumn;
                        continue;
                    }

                    throw new IllegalArgumentException("Invalid column "
                            + projectionIn[i]);
                }

    变量mStrictProjectionMap的值是由第一段代码设置为了true,因而在构建查询语句时,想将待查的表名做个别名的机会也没有了。

0
0
分享到:
评论

相关推荐

    基于Android&SQLite实现的通讯录

    在Android系统中,每个应用程序都有自己的SQLite数据库,可以自由创建表、插入数据、更新记录、删除数据以及查询信息。 要创建一个基于SQLite的通讯录应用,我们需要做以下步骤: 1. **创建SQLite数据库**:在...

    AndroidDialer_android源码_源码

    - **ContactProvider**:联系人信息的提供者,对接SQLite数据库,实现了ContentProvider接口,使得其他应用可以通过ContentResolver查询或修改联系人信息。 - **DialtactsActivity**:主界面,展示了联系人列表,...

    android开发

    在【总体设计方案】中,系统模块被合理划分,包括用户管理、联系人管理、通讯功能、查找功能、备份等功能。设计遵循标准开发流程,确保程序质量和可用性。系统运行流程图清晰地展示了用户如何操作通讯录,包括添加、...

    android版通讯录

    最后,同步联系人数据库到服务器是这款通讯录应用的一大亮点。它允许用户将本地的联系人数据安全地备份到云端,确保即使设备丢失或更换,也能快速恢复重要的联系人信息。压缩包中的"TestSocket2"文件很可能就是实现...

    android家教app

    Android 6.0及以上版本引入了运行时权限管理,应用需要在运行时请求用户的权限,例如访问联系人、存储、相机等。 10. **性能优化** 对于任何应用来说,性能优化都是关键。通过内存管理、UI优化、后台服务优化等...

    Android-Notes.rar_android

    4. **权限管理**:Android 6.0(API级别23)引入了运行时权限,应用在运行时需要请求敏感权限,如访问联系人或位置信息。 5. **通知系统**:Android的通知系统允许应用在状态栏展示消息,即使应用不在前台运行也能...

    基于ARM9 S3C2440的Android操作系统移植.pdf

    Android系统的核心应用程序包括邮件客户端、短信程序、日历、地图、浏览器和联系人管理器。系统通过以下组件支持应用程序的开发和交互: 1. 可扩展的视图系统:提供各种界面元素,如列表、网格和文本框。 2. 内容...

    android 文件管理 源码

    在Android系统中,文件管理是应用开发中不可或缺的一部分。源码分析可以帮助我们深入理解文件操作的内部机制,提高开发效率并解决可能出现的问题。本篇将围绕"android 文件管理 源码"这一主题,详细探讨Android文件...

    Android高级编程--源代码

    在每章的讲解中,它会让你通过一系列示例项目逐步掌握Android中的各种新功能和技术,助你取得最圆满的学习效果。本书所介绍的各个应用实例简明扼要且极具实用价值,它们覆盖了Android 1.0的所有基本功能和高级功能...

    android 2.3 phone apk 源码

    【描述】"android 2.3 phone apk 源码" 提供的是 Gingerbread(2.3)版本的电话应用源代码,这是一个关键的系统应用,负责处理拨打电话、接收来电、显示联系人等基本通讯功能。源码的分析有助于开发者学习如何在早期...

    基于Android的短息备份毕业设计.doc

    - Android是一个开源且自由的移动操作系统,由操作系统、中间件、用户界面以及应用程序组成。其核心基于Linux内核,支持Dalvik虚拟机运行Java语言编写的程序。 - Google与开放手机联盟(OHA)合作开发Android,该...

    深入浅出Android--Google手持设备应用程序设计

    Android有严格的权限模型,开发者需要在应用的清单文件中声明所需的权限,如访问联系人、发送短信等。用户在安装应用时会看到这些权限请求。 八、Android硬件接口 Android提供了一系列API,让开发者能够访问设备的...

    毕业论文安卓801个人信息管理系统app.doc

    作者详细介绍了Android作为操作系统的基础特性,以及其在移动应用开发中的重要地位。此系统旨在提供通讯录管理、记事管理、日程管理和城市天气预报等功能,以满足用户日常个人信息管理的需求。 **1. 技术背景与意义...

    个人仿制android QQ app

    在IT行业中,Android平台上的QQ应用程序是一个非常典型且用户基数庞大的社交应用。为了学习和理解Android应用开发,许多开发者会尝试仿制这样的热门应用,以此来掌握核心功能的实现。"个人仿制android QQ app"项目...

    基于Android手机的课程表应用的设计与实现 论文.doc

    1. **应用程序层**:包含了预装在设备上的各种应用软件,如联系人、日历等。 2. **应用程序框架层**:提供了一系列服务和API接口,用于构建应用程序。 3. **库层**:包含了一系列核心库,如SQLite数据库、SSL安全...

    Android应用源码之安卓桌面应用EyeRoom.zip

    在移动操作系统领域,Android以其开源、自由的特点占据了举足轻重的地位。开发者们通过学习和理解Android应用源码,可以提升自己的编程技能,理解系统运行机制,以及优化应用性能。本篇文章将深入探讨名为EyeRoom的...

    Fragment仿QQ

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在单个活动中展示多个视图或界面。"Fragment仿QQ"项目旨在模仿QQ应用的界面设计和交互,利用Fragment来实现各种功能模块的划分,提高用户...

    android电子书

    - **存储**:Android提供了多种存储数据的方式,如文件系统、SQLite数据库等。 - **网络**:支持HTTP/HTTPS等网络协议,可以实现与服务器的通信。 - **多媒体**:支持音频、视频、图像等媒体格式,可以实现多媒体...

Global site tag (gtag.js) - Google Analytics