一、Cursor的数据模型

之前一直搞不懂Cursor的数据模型是怎么样的,等到看到下面别人博客中把Cursor比作.net中的DataReader才明白,原来是这么回事。但是没 学过.Net的同志可能还是不明白Cursor是怎么一回事,怎么取它的数据,和它的数据为什么那么取。

上面的表代表的是一个cursor对象。

当我们用query方法查询到的是一个指向cursor对象第一行的前面一行数据,即上图中的空行。所以我们使用cursor.moveToNext()方法时,是指向cursor的第一行数据,而不是第二行。

如何得到cursor中的数据呢?

当我们使用了cursor.movetonext()后,cursor指向了第一行数据,由于是数据库中的表,所以每一行每一列都有对应的数据类型和列名。

当我们要取出cursor对象中的一个对应的数据,首先我们要先确定它的数据类型,用cursor.getxxx()。xxx代表的是你要取出的数据的数据类型,当前我们要取出第一行的“列名2”的数据。就可以用cursor.getString()。

然后我们确定了数据类型后,肯定要确定列名,所以我们要得到cursor对象中的列名,用cursor.getColumnIndex("列名")来获得。

这样我们要取出第一行第二列的数据时,就可以用cursor.getString(cursor.getColumnIndex("列名2"))来获得。

取第二行的数据只要继续cursor.moveToNext(),到了第二行后,跟取第一行的数据是一样的。

二、Cursor的接口方法

使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader。今天特地将它单独拿出来谈,加深自己和大家对Android 中使用 Cursor 的理解。

关于 Cursor。在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情:

  • Cursor 是每行的集合。
  • 使用 moveToFirst() 定位第一行。
  • 你必须知道每一列的名称。
  • 你必须知道每一列的数据类型。
  • Cursor 是一个随机的数据源。
  • 所有的数据都是通过下标取得。

关于 Cursor 的重要方法:

  • close() 
    关闭游标,释放资源
  • copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 
    在缓冲区中检索请求的列的文本,将将其存储
  • getColumnCount() 
    返回所有列的总数
  • getColumnIndex(String columnName) 
    返回指定列的名称,如果不存在返回-1
  • getColumnIndexOrThrow(String columnName) 
    从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
  • getColumnName(int columnIndex) 
    从给定的索引返回列名
  • getColumnNames() 
    返回一个字符串数组的列名
  • getCount() 
    返回Cursor 中的行数
  • moveToFirst() 
    移动光标到第一行
  • moveToLast() 
    移动光标到最后一行
  • moveToNext() 
    移动光标到下一行
  • moveToPosition(int position) 
    移动光标到一个绝对的位置
  • moveToPrevious() 
    移动光标到上一行

下面来看看一小段代码:

if  (cur.moveToFirst() == false )
{// 为空的Cursorreturn ;
}

访问 Cursor 的下标获得其中的数据

int  nameColumnIndex  =  cur.getColumnIndex(People.NAME);
String name  =  cur.getString(nameColumnIndex);

现在让我们看看如何循环 Cursor 取出我们需要的数据

while (cur.moveToNext())
{// 光标移动成功// 把数据取出
}

当cur.moveToNext() 为假时将跳出循环,即 Cursor 数据循环完毕。

如果你喜欢用 for 循环而不想用While 循环可以使用Google 提供的几下方法:

  • isBeforeFirst() 
    返回游标是否指向之前第一行的位置
  • isAfterLast() 
    返回游标是否指向第最后一行的位置
  • isClosed() 
    如果返回 true 即表示该游戏标己关闭

有了以上的方法,可以如此取出数据

for (cur.moveToFirst(); ! cur.isAfterLast(); cur.moveToNext())
{int  nameColumn  =  cur.getColumnIndex(People.NAME);int  phoneColumn  =  cur.getColumnIndex(People.NUMBER);String name  =  cur.getString(nameColumn);String phoneNumber  =  cur.getString(phoneColumn);
}

Tip:在Android 查询数据是通过Cursor 类来实现的。当我们使用 SQLiteDatabase.query()方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据。结合ADO.net 的知识可能好理解一点。

Cursor 位于 android.database.Cursor类,可见出它的设计是基于数据库服务产生的。

另外,还有几个己知的子类,分别为:

  • AbstractCursor
  • AbstractWindowedCursor
  • CrossProcessCursor
  • CursorWrapper
  • MatrixCursor
  • MergeCursor
  • MockCursor
  • SQLiteCursor

Android Cursor的一些浅显见解相关推荐

  1. Android Cursor自动更新的实现和原理

    原文链接:http://www.sxrczx.com/pages/kohoh1992.github.io/cursor-auto-sync/index_1431878338570.html 在Andr ...

  2. Android Cursor类的概念和用法

    http://www.2cto.com/kf/201109/103163.html 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: ...

  3. android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?

    完整代码如下: 其中有大部分的代码被注释,那是可以成功运行的. 后来我想啊,游戏有好多种,但是需要统计的内容是一样的. 我就想传参 然后获得返回值的方式 来减少代码量啊. 但是把相关的查询代码放到 带 ...

  4. cursor 过滤 android,Android cursor query方法详解

    1.cursor query 方法入参 public final Cursor query (Uri uri, String[] projection,String selection,String[ ...

  5. android view moveto,android – cursor.moveToPosition(i)的速度有多快?

    想知道是否调用了cursor.moveToPosition(i);会触发持久存储操作,还是只读取内存缓存? 在Android中的RecycleView适配器中,这是经常调用的,我不想重载系统访问持久存 ...

  6. android cursor

    Cursor作用类似于java中resultSet,把查询到的结果集封装在一个Cursor对象当中.cursor就像是结果集上的一个游标,可以向前向后移动. 常用方法: moveToFirst(); ...

  7. android cursor 空,java – Android:即使数据库不为空,Cursor也总是返回null

    即使数据库不为空,Cursor也始终返回null.为什么?以及如何解决?谢谢. public StatParcours getOneUserInfo(int id) { SQLiteDatabase ...

  8. android cursor关闭,android在异步任务中关闭Cursor的代码方法

    查询数据会比较耗时,所以我们想把查询数据放在一个异步任务中,查询结果获得Cursor,然后在onPostExecute (Cursor result)方法中设置Adapter,我们可能会想到使用Act ...

  9. android手机CPU的浅显认识与比较

    一部手机程序运行的快慢,游戏的流畅度,不过分的说90%取决于其采用的CPU的性能.可以说CPU就是这部手机的心脏.所以在买智能手机的时候,抛开外观不说,用户多数首先看的是其心脏够不够强大,但是大家一般 ...

最新文章

  1. 慎用SELECT INTO复制表
  2. curd什么意思中文_每日一句英译英:She's a ten什么意思?
  3. [Redux/Mobx] 在redux中,什么是store?
  4. linux6.5+5.4 vncserver配置
  5. C#项目实例中读取并修改App.config文件
  6. linux运维生产场景常用软件工具一览
  7. 如何制作统计报表(盈帆报表: efreprt.com)
  8. 小米浏览器html文件怎么打开方式,怎么设置浏览器-开启小米浏览器这三个功能,切换、搜索、编辑都让你事半功倍...
  9. 直播丨上海传智播客-黑马程序员/黑马设计师-封箱之作-“大神季”
  10. libopus 实现pcm 编码到opus
  11. 微信小程序input只允许输入数字
  12. linux中的__setup的作用
  13. 麻省理工学院-人工智能公开课总结01
  14. java 内部类,匿名内部类
  15. mysql表文件被删除,MySQL数据表InnoDB引擎表文件误删恢复
  16. python做估值模型_通证估值模型-费雪模型与净现值模型详解
  17. 抖音一个老人和一个机器人歌曲_抖音空巢老人背景音乐是什么歌_抖音空巢老人背景音乐介绍_游戏吧...
  18. Python按特定字符分列
  19. python计算机视觉--全景图像拼接
  20. 如何让企业员工不觉得知识库是个鸡肋,附带工具推荐

热门文章

  1. MIT小黄鸭智能车课程(适用于中小学和大学的机器人教学方案)
  2. pytorch LSTM的股价预测
  3. 很多人认为创业公司很难成功,这是一个事实
  4. 数据库集合运算与关系代数
  5. oracle学号查询平均成绩,orcal数据库中查询出平均成绩大于60分的同学的学号和平均成绩...
  6. 随笔-Android openGL-三棱锥纹理
  7. JS可选链操作符 (?.)
  8. attrib批量显示文件夹_怎样批量修改文件夹或文件的系统隐藏属性
  9. 第六章 戚继光——孤独的将领 –2(稍微次要)
  10. 如何选择适合你的兴趣爱好(六十六),折纸