Android Cursor的一些浅显见解
一、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的一些浅显见解相关推荐
- Android Cursor自动更新的实现和原理
原文链接:http://www.sxrczx.com/pages/kohoh1992.github.io/cursor-auto-sync/index_1431878338570.html 在Andr ...
- Android Cursor类的概念和用法
http://www.2cto.com/kf/201109/103163.html 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: ...
- android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?
完整代码如下: 其中有大部分的代码被注释,那是可以成功运行的. 后来我想啊,游戏有好多种,但是需要统计的内容是一样的. 我就想传参 然后获得返回值的方式 来减少代码量啊. 但是把相关的查询代码放到 带 ...
- cursor 过滤 android,Android cursor query方法详解
1.cursor query 方法入参 public final Cursor query (Uri uri, String[] projection,String selection,String[ ...
- android view moveto,android – cursor.moveToPosition(i)的速度有多快?
想知道是否调用了cursor.moveToPosition(i);会触发持久存储操作,还是只读取内存缓存? 在Android中的RecycleView适配器中,这是经常调用的,我不想重载系统访问持久存 ...
- android cursor
Cursor作用类似于java中resultSet,把查询到的结果集封装在一个Cursor对象当中.cursor就像是结果集上的一个游标,可以向前向后移动. 常用方法: moveToFirst(); ...
- android cursor 空,java – Android:即使数据库不为空,Cursor也总是返回null
即使数据库不为空,Cursor也始终返回null.为什么?以及如何解决?谢谢. public StatParcours getOneUserInfo(int id) { SQLiteDatabase ...
- android cursor关闭,android在异步任务中关闭Cursor的代码方法
查询数据会比较耗时,所以我们想把查询数据放在一个异步任务中,查询结果获得Cursor,然后在onPostExecute (Cursor result)方法中设置Adapter,我们可能会想到使用Act ...
- android手机CPU的浅显认识与比较
一部手机程序运行的快慢,游戏的流畅度,不过分的说90%取决于其采用的CPU的性能.可以说CPU就是这部手机的心脏.所以在买智能手机的时候,抛开外观不说,用户多数首先看的是其心脏够不够强大,但是大家一般 ...
最新文章
- 慎用SELECT INTO复制表
- curd什么意思中文_每日一句英译英:She's a ten什么意思?
- [Redux/Mobx] 在redux中,什么是store?
- linux6.5+5.4 vncserver配置
- C#项目实例中读取并修改App.config文件
- linux运维生产场景常用软件工具一览
- 如何制作统计报表(盈帆报表: efreprt.com)
- 小米浏览器html文件怎么打开方式,怎么设置浏览器-开启小米浏览器这三个功能,切换、搜索、编辑都让你事半功倍...
- 直播丨上海传智播客-黑马程序员/黑马设计师-封箱之作-“大神季”
- libopus 实现pcm 编码到opus
- 微信小程序input只允许输入数字
- linux中的__setup的作用
- 麻省理工学院-人工智能公开课总结01
- java 内部类,匿名内部类
- mysql表文件被删除,MySQL数据表InnoDB引擎表文件误删恢复
- python做估值模型_通证估值模型-费雪模型与净现值模型详解
- 抖音一个老人和一个机器人歌曲_抖音空巢老人背景音乐是什么歌_抖音空巢老人背景音乐介绍_游戏吧...
- Python按特定字符分列
- python计算机视觉--全景图像拼接
- 如何让企业员工不觉得知识库是个鸡肋,附带工具推荐
热门文章
- MIT小黄鸭智能车课程(适用于中小学和大学的机器人教学方案)
- pytorch LSTM的股价预测
- 很多人认为创业公司很难成功,这是一个事实
- 数据库集合运算与关系代数
- oracle学号查询平均成绩,orcal数据库中查询出平均成绩大于60分的同学的学号和平均成绩...
- 随笔-Android openGL-三棱锥纹理
- JS可选链操作符 (?.)
- attrib批量显示文件夹_怎样批量修改文件夹或文件的系统隐藏属性
- 第六章 戚继光——孤独的将领 –2(稍微次要)
- 如何选择适合你的兴趣爱好(六十六),折纸