应用 Android SQL 数据库时,遇到的问题:

场景1:Android SQL查询后,获取到Cursor并查询数据;遇到以下问题:"android.database.CursorIndexOutOfBoundsException: Index -1 requested"

  1. D/Demo (22249): [ContackPickerActivity] onItemClick::cursor.getCount()=70; position=1
  2. D/Demo (22249): [ContackPickerActivity] outUri.toString()=content://com.android.contacts/contacts/2
  3. D/Demo (22249): [ContactPickerTestActivity] onActivityResult::requestCode=1000
  4. D/Demo (22249): [ContactPickerTestActivity] onActivityResult::PICK_CONTACK running...
  5. D/Demo (22249): [ContactPickerTestActivity] onActivityResult::contackData=content://com.android.contacts/contacts/2
  6. D/Demo (22249): [ContactPickerTestActivity] ERROR is detected...android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

源代码如下:

  1. switch (requestCode) {
  2. case PICK_CONTACK:
  3. if (resultCode == Activity.RESULT_OK) {
  4. LogUtil.d(TAG, "onActivityResult::PICK_CONTACK running...");
  5. Uri contactData = data.getData();
  6. LogUtil.d(TAG, "onActivityResult::contackData="
  7. + contactData.toString());
  8. Cursor cursor = getContentResolver().query(contactData,
  9. null, null, null, null);
  10. if (cursor != null) {
  11. String name;
  12. try {
  13. name = cursor
  14. .getString(cursor
  15. .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
  16. cursor.close();
  17. TextView tv = (TextView) findViewById(R.id.selected_contact_textview);
  18. tv.setText(name);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. LogUtil.d(TAG,
  22. "ERROR is detected..." + e.toString());
  23. }
  24. }
  25. }
  26. break;
  27. default:
  28. break;
  29. }

问题出在以下点:

  1. name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));

在使用query()查询时,返回结果描述如下:

  1. * @return A Cursor object, which is positioned before the first entry, or null

Cursor指针指向的是查询结果的前一位置,在这之后调用的getColumnIndex()出现超出“边界”的异常。

解决办法:调用moveToFirst()即可

  1. if (cursor != null && cursor.moveToFirst()) {
  2. String name;
  3. try {
  4. name = cursor
  5. .getString(cursor
  6. .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
  7. cursor.close();
  8. TextView tv = (TextView) findViewById(R.id.selected_contact_textview);
  9. tv.setText(name);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. LogUtil.d(TAG,
  13. "ERROR is detected..." + e.toString());
  14. }
  15. }

Android SQL数据库应用实践 “问题点”“疑难点”“解析”的更多相关文章

  1. 数据库优化实践【MS SQL优化开篇】

    数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...

  2. 基于Sql Server 2008的分布式数据库的实践(五)

    原文 基于Sql Server 2008的分布式数据库的实践(五) 程序设计 ------------------------------------------------------------- ...

  3. 基于Sql Server 2008的分布式数据库的实践(四)

    原文 基于Sql Server 2008的分布式数据库的实践(四) 数据库设计 1.E-R图 2.数据库创建 Win 7 1 create database V3 Win 2003 1 create  ...

  4. 基于Sql Server 2008的分布式数据库的实践(三)

    原文 基于Sql Server 2008的分布式数据库的实践(三) 配置PHP 1.打开PHP配置文件,找到extension=php_mssql.dll,将前面的注释符号去掉 2.找到mssql.s ...

  5. 基于Sql Server 2008的分布式数据库的实践(二)

    原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 ...

  6. 基于Sql Server 2008的分布式数据库的实践(一)

    原文 基于Sql Server 2008的分布式数据库的实践(一) 配置Sql Server 2008(Win7) 1.打开SQL server2012,使用windows身份登录 2.登录后,右键选 ...

  7. Android - 数据存储 -在SQL数据库中保存数据

    对于重复的或结构化的数据,保存到数据库中是很好的选择,比如联系人信息.这里假设你对SQL数据库大体上了解然后帮助你学习Android上的SQLite数据库.在Android数据库上需要用到的API可以 ...

  8. 【Android Developers Training】 26. 在SQL数据库中保存数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

随机推荐

  1. 利用 /proc/sys/kernel/core_pattern隐藏系统后门

    ref:https://xz.aliyun.com/t/1098/ 这里所说的core_pattern 指的是:/proc/sys/kernel/core_pattern. 我们知道在Linux系统中 ...

  2. DirectX11--深入理解HLSL常量缓冲区打包规则

    HLSL常量缓冲区打包规则 DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报. 尽管打包规则并不 ...

  3. ArcMap修改粘滞移动容差防止要素在选择时无意拖动移动

    粘滞移动容差将设置一个最小像素数,鼠标指针必须在屏幕上移动了此最小距离时,所选要素才会实际发生移动. 设置粘滞移动容差的结果是延迟移动所选要素,直到指针至少移动了这段距离.此方法可用于在使用“编辑”工 ...

  4. Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  5. [物理学与PDEs]第1章习题1 无限长直线的电场强度与电势

    设有一均匀分布着电荷的无限长直线, 其上的电荷线密度 (即单位长度上的电荷量) 为 $\sigma$. 试求该直线所形成的电场的电场强度及电势. 解答: 设空间上点 $P$ 到直线的距离为 $r$, ...

  6. tangent space与object space

    3d渲染每个网格(Mesh)的面都可配一个材质(Material),要想在一个面上显示出更多的细节,除了模型做的更精致,还可以使用法线贴图(Normal Texture). 法线向量(Normal V ...

  7. Nginx--服务部署、基于域名的虚拟主机配置

    一.服务部署 1.预处理 安装CentOS ,配置hosts.静态IP.设置必要的安全参数等(略) 1-1.系统环境 [root@vnx ~]# cat /etc/redhat-release Cen ...

  8. iPhone8再MacOS上修改手机铃声

    1 选择下载好的mp3铃声文件,导入到itunes 2 将音乐改成AAA模式, 设置你的铃声时长 3 show in finder 找到文件,将mpr后缀修改成m4r,并删除掉mp3文件,将m4r文件 ...

  9. vue组件化的应用

    前言:vue组件化的应用涉及到vue-cli的内容,所以在应用之前是需要安装node和vue-cli的,具体如何安装我就不一一赘述了.可能一会儿我心情好的时候,可以去整理一下. 1.应用的内容:在一个 ...

  10. 【转载】Pytorch tutorial 之Datar Loading and Processing

    前言 上文介绍了数据读取.数据转换.批量处理等等.了解到在PyTorch中,数据加载主要有两种方式: 1.自定义的数据集对象.数据集对象被抽象为Dataset类,实现自定义的数据集需要继承Datase ...