Cursor 介绍

简介:
这个接口提供随机读写访问一个数据库查询返回的结果集
游标实现不需要从多个线程同步所以代码,使用游标使用光标时应该执行自己的同步。

方法:
void close();
关闭游标,释放所有的资源,使其完全无效。
void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
文本检索请求的列,并将其存储在缓冲区。
void deactivate ()
这种方法在API 16时弃用。会让光标都失活,使所有调用失败,直到重新查询()。
int getColumnCount ()
返回列的总数
int getColumnIndex (String columnName)
返回从0开始的给定的列的索引名称,如果列不存在返回-1。
int getColumnIndexOrThrow (String columnName)
返回从0开始的给定的列名称的索引名称,如果列不存在则抛出 IllegalArgumentException异常。
String getColumnName (int columnIndex)
更具索引返回列的名字。
String[] getColumnNames ()
返回按顺序排列的列的名字数组。
int getCount ()
返回游标的列的数量。
int getPosition ()
返回游标当前在行中的位置
int getType (int columnIndex)
返回给定列的索引,返回类型
boolean getWantsAllOnMoveCalls ()
boolean isAfterLast ()
返回游标是否在最后一行后面位置
boolean isBeforeFirst ()
返回游标是否在第一行前面位置
boolean isClosed ()
返回游标是否关闭
boolean isFirst ()
返回游标是否指向第一行
boolean isLast ()
返回游标是否指向最后一行
boolean isNull (int columnIndex)
返回指定列是否为空
boolean move (int offset)
将游标移到一个特定位置,相对于当前位置,前进或者后退一定的位置。正数代表向前移动,负数代表向后移动。当然如果这个值超出了表的范围,那么移动的范围也就是这个表的两边,即表示为第一个的前一个和最后一个的后一个(PS:通过英语,我是这么理解的)。
返回值代表是否移动成功。
boolean moveToFirst ()
游标移动到第一行
boolean moveToLast ()
游标移动到最后一行
boolean moveToNext ()
游标移动到下一行
boolean moveToPosition (int position)
将游标移动到一个绝对位置,当然有效范围是:-1 <= position <= count。
返回值代表移动的结果。
boolean moveToPrevious ()
将游标移动到上一行
void registerContentObserver (ContentObserver observer)
注册一个观察者,当数据表数据变化时刷新游标数据
void registerDataSetObserver (DataSetObserver observer)
注册一个观察者,当游标中的数据集发生变化时被调用。
boolean requery ()
此方法在API 11时已被弃用。
void unregisterContentObserver (ContentObserver observer)
移除注册观察者
void unregisterDataSetObserver (DataSetObserver observer)
移除注册观察者

下面简单说说Cursor的使用,比如查询一个班级学生表,并显示,查询出的学生肯定不止一个,Cursor中应该有一个数据集,每一行都是一个学生对象。如下图所示:
这里写图片描述
需要循环从头到尾遍历,或者直接移动光标位置,根据类型获取相对的数据。
while(cursor.moveToNext()){
int age = cursor.getInt(cursor.getColumnIndexOrThrow(“age”));
String name = cursor.getSring(cursor.getColumnIndexOrThrow(“name”));
boolean sex = Boolean.parseBoolean(cursor.getSring(cursor.getColumnIndexOrThrow(“sex”)));
float height = cursor.getFloat(cursor.getColumnIndexOrThrow(“height”));
}
差不多就是这样,简单的取Cursor中的数据,官方没有提供boolean类型的存取方法,所以要么就是用int 0或1,要么就是字符串存储然后再转型。

这都是简单使用,明白就好,之后研究下registerContentObserver (ContentObserver observer)和 registerDataSetObserver (DataSetObserver observer)的相同和不同之处。

<think>嗯,用户问的是数据库游标的概念和使用方法。首先,我需要回忆一下游标的基本定义。根据引用里的信息,游标就像是一个指针,用来逐行处理结果集。用户可能是在开发中遇到了需要逐行处理数据的情况,比如在存储过程或者脚本里处理查询结果。 然后,我要整理游标的特性。引用中提到的,游标可以保存查询结果,这样重复使用比多次查询更快。这可能对性能有帮助,但也要注意游标可能会占用内存,所以得合理使用。用户可能想知道什么时候该用游标,什么时候不该用。 接下来是使用方法。根据引用3里的DB2例子,游标的使用步骤通常是声明、打开、读取、关闭。需要详细说明每一步的语法和注意事项。比如声明游标时的SELECT语句,打开时执行查询,读取时用FETCH获取数据,最后关闭释放资源。 还要提到不同的游标类型,比如只进游标和可滚动游标,以及敏感度的问题。用户可能在处理需要回滚或者更新的数据时会用到这些类型。比如,引用2里提到游标可以指向数据行的指针,可能涉及到数据的修改,所以敏感游标和 insensitive 的区别很重要。 另外,应用场景也很关键。用户可能想知道游标适合哪些情况,比如逐行处理、事务控制或者数据导出。同时,也要提醒游标的缺点,比如性能问题,避免在大量数据时使用。 最后,生成相关问题的时候,要围绕游标的优化、替代方案和不同数据库的实现差异,这样用户如果有进一步的问题,可以继续深入。需要确保引用的信息准确,比如引用1提到MySQL的游标特性,引用3是DB2的例子,要正确标注来源。</think>### 数据库游标的概念与使用方法 #### 一、游标的定义 数据库游标(cursor)是一种**临时数据库对象**,用于逐行处理查询结果集。它类似于指针,能够遍历包含多条记录的查询结果,但每次只指向一行数据[^2]。游标的核心作用是为开发者提供对结果集的**精细化控制**,尤其是在需要逐行操作或更新数据的场景中。 #### 二、游标的特性 1. **逐行处理**:游标每次仅操作结果集中的一行数据。 2. **临时存储**:游标保存查询结果的副本或指向原始数据的指针。 3. **可重复使用**:声明一次游标可多次遍历结果集,减少重复查询开销。 4. **事务控制**:支持在遍历过程中执行数据更新或删除操作。 #### 三、游标的使用步骤(以MySQL为例) 1. **声明游标** 定义游标并绑定查询语句: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table WHERE condition; ``` 2. **打开游标** 执行查询并加载结果集到内存: ```sql OPEN cursor_name; ``` 3. **读取数据** 逐行获取数据并进行处理: ```sql FETCH cursor_name INTO var1, var2; -- 示例:将当前行的列值存入变量var1、var2 ``` 4. **关闭游标** 释放结果集占用的资源: ```sql CLOSE cursor_name; ``` #### 四、游标类型与参数 1. **只进游标(FORWARD ONLY)** 仅支持单向遍历,适用于简单逐行读取。 2. **可滚动游标(SCROLL)** 支持双向移动(如`FETCH PRIOR`、`FETCH ABSOLUTE 5`),适合复杂定位需求。 3. **敏感度控制** - **SENSITIVE**:反映其他事务对数据的修改。 - **INSENSITIVE**:保存结果集快照,不反映外部变更[^3]。 #### 五、应用场景与注意事项 1. **典型场景** - 存储过程中逐行处理数据(如计算、校验) - 需要根据条件动态更新或删除记录 - 批量数据导出或转换 2. **性能优化建议** - 避免在大数据集上使用游标(可能导致内存压力) - 优先使用集合操作替代逐行处理 - 及时关闭游标释放资源 #### 示例代码(MySQL存储过程) ```sql DELIMITER $$ CREATE PROCEDURE process_orders() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE order_id INT; DECLARE cur CURSOR FOR SELECT id FROM orders WHERE status='pending'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO order_id; IF done THEN LEAVE read_loop; END IF; -- 对每个order_id执行操作(例如调用其他存储过程) CALL update_order_status(order_id, 'processed'); END LOOP; CLOSE cur; END$$ DELIMITER ; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值