Android中的Cursor到底是什么?如何理解Cursor的方法都在做什么事情?

标签: Cursor query SQLite android moveToFirst
5961人阅读 评论(7) 收藏 举报
分类:

一:Cursor到底是什么?

网上很多博客都介绍了Cursor,介绍了各种概念,各种原理。可是有的小伙伴可能还是很懵逼,这特码的到底都是什么。

刚开始接触Cursor的时候也是一脸懵逼,看到人家说这个方法是在干什么干什么,可以脑子里没有一个生动形象的动作过程就感觉理解不了。Cursor是什么呢?是游标,可能有的小伙伴不知道什么是游标,看下图。


OK了吧,是不是OK了,光标是什么意思还用解释吗,我们在输入信息的时候能看到的那个一闪一闪的短线,那不就是光标吗,所以呢,我们也可以把游标理解成这个一闪一闪的短线。


二:我们是怎么获得Cursor对象的呢?


一般情况下:

SQLiteDataBase db;

Cursor cursor = db.query(各种参数);

这时,就出现了网上的解释了,说cursor是每行的集合。

每行的集合....

每行的集合....

每行的集合....

其实开始看到这几个字的时候我是认为我理解的,可是继续一寻思,可能就会有这种疑惑,它是把一行中的所有内容装到集合中呢,还是把所有行装到一个集合中啊,而且这个行是什么啊等等一系列小白问题。

现在先解释一下SQLite数据库中是怎么存放数据的,是以表的形式存放的,看这个表Student。




这里的id,name,age,gender,school,city就是列名,name这一列下面就对应着一个对象的name属性。所以我们能看到,一行的意思就是我们存放的一个对象了,比如张三这一行,名字是张三,在年龄这一列上是5,那么这个name属性为张三的对象,它的age的属性就为5。

所以这个每行的集合的意思,是获得的满足条件(就是我们query方法中传入的条件参数)的所有行。

比如我要在这个表中找gender为男的,那么获得到的cursor就包含了张三行,赵六行,孙七行。


三:我在遍历cursor内容的时候,为什么要先moveToFirst()?


我们采用反证法,我们不进行moveToFirst()操作,我们获取游标对象后,直接输出它当前的position值




可以看到,直接输出的position的值是-1,也就相当于我们刚开始获得它的时候,它是在第0行上面闪动呢。


所以我们使用moveToFirst后在输出position就会发现position=0了,使用moveToNext也可以。


四:moveToNext如何得知是否已经遍历完毕呢?


我们翻看源码,会发现moveToFirst,moveToNext,moveToLast,moveToPrevious等最后都会执行到这个方法


图中说的:这个对象在初始化的时候,指的就是当前页面的那个对象。mPos=-1被写在一个空参构造方法里了。

看源码的时候也能发现:

moveToFirst调用的是moveToPosition(0)

moveToNext调用的是moveToPosition(mPos+1)

所以如果是第一次调用的话,这两句话的意思是一样的(开始mPos=-1)。




查看评论

Android中Cursor类的概念和用法

又是新的一天,加油!
  • yuan15800904094
  • yuan15800904094
  • 2016-04-02 10:45:46
  • 2593

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

原文链接:http://www.sxrczx.com/pages/kohoh1992.github.io/cursor-auto-sync/index_1431878338570.html在Andro...
  • axi295309066
  • axi295309066
  • 2016-12-27 13:01:11
  • 1338

深入分析android中的Cursor 对象是如何获得的

最近在开发一个app应用的时候,需要用到数据库,以前都只是调用了接口,完成了功能,就没有关注过太多的细节东西,今天去仔细的分析了android中创建 Cursor对象的源码,和大家分享一下。   首...
  • hkwlg1314
  • hkwlg1314
  • 2015-12-02 10:15:59
  • 1106

Android开发:getContentResolver的使用

getContentResolver的使用 分两种情况: 一、在有Activity和Service的情况下   getContext().getContentResolver().insert(.....
  • daniel80110_1020
  • daniel80110_1020
  • 2017-02-16 17:14:39
  • 9775

对Android中的Cursor一些浅显见解

之前一直搞不懂Cursor的数据模型是怎么样的,等到看到下面别人博客中把Cursor比作.net中的DataReader才明白,原来是这么回事。但是没 学过.Net的同志可能还是不明白Cursor是怎...
  • kite5121314
  • kite5121314
  • 2014-03-13 10:03:00
  • 2372

Android SQLite分页查询的三种方法

闲话不多说,直入话题,SQLite分页查询有三种方法,它们都是基于SQLite SQL查询来的,首先我们看下SQLite分页查询的SQL语句,有助于我们理解: 1 ...
  • lu1024188315
  • lu1024188315
  • 2016-06-22 15:18:47
  • 11025

android之Activity.startManagingCursor方法详解

在使用数据库操作查询数据后,如果是在Activity里面处理,那么很可能就会用到startManagingCursor()方法,在这里讲一下它的作用和使用注意事项. 调用这个方法,就是将获得的Cur...
  • jason0539
  • jason0539
  • 2013-08-15 15:55:53
  • 9544

Android Cursor浅析

Android Cursor分析
  • Sailingthink
  • Sailingthink
  • 2014-06-05 12:58:10
  • 3008

Android中的Cursor

Android 使用的数据库是SQLite数据库,对于数据库记录的操作,可以使用Cursor(游标)来进行。 1. 关于 Cursor 在你理解和使用 Android Cursor 的时候...
  • liranke
  • liranke
  • 2011-11-01 18:47:20
  • 26134

Android Cursor用法

Cursor作用类似于java中resultSet,把查询到的结果集封装在一个Cursor对象当中。cursor就像是结果集上的一个游标,可以向前向后移动。 常用方法: close() 关闭游标,释...
  • hejiero
  • hejiero
  • 2014-02-08 20:38:14
  • 3838
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 808
    排名: 6万+
    文章存档
    最新评论