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)
{
//为空的Cursor
return;
}

访问 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类,可见出它的设计是基于数据库服务产生的。

游标(Cursor)主要用于数据库操作,是一种可以遍历查询结果集的对象。它允许逐行处理数据,并对每一行进行读取、修改等操作。以下是关于如何使用游标的详细介绍: ### 创建并打开游标 首先,在大多数SQL环境中,你需要声明一个游标并与特定的SELECT语句关联起来。 ```sql DECLARE my_cursor CURSOR FOR SELECT column_name(s) FROM table_name WHERE condition; OPEN my_cursor; -- 打开游标以便开始从中检索数据 ``` ### 获取数据 一旦打开了游标,就可以通过`FETCH`命令从当前记录指针的位置获取单条记录到变量中去。 ```sql FETCH NEXT FROM my_cursor INTO @variable_list; ``` 这里每次都会向前移动一行并且把值放入指定的目标变量里边。 ### 关闭及释放资源 完成所有需要的操作之后,应当记得关闭游标以节省系统资源以及解除锁定。 ```sql CLOSE my_cursor; DEALLOCATE my_cursor; ``` 这四个步骤构成了基本的游标工作流程:**声明->打开->提取(循环)->关闭&释放** --- 当涉及到实际的应用程序开发语言如Python连接MySQL时,则会有所区别: 对于Python而言,我们通常不会直接操作SQL中的游标语法,而是利用像PyMySQL这样的库提供的API来间接管理它们。下面给出一段简单的示例代码片段用于说明这一过程。 ```python import pymysql.cursors connection = pymysql.connect(host='localhost', user='root', password='', db='testdb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: sql_query = "SELECT `id`, `name` FROM `users`" cursor.execute(sql_query) # 遍历所有的返回结果 for row in cursor.fetchall(): print(f"ID={row['id']}, Name={row['name']}") finally: connection.close() ``` 此段脚本展示了怎样在一个安全的方式下建立同数据库间的链接、创建游标实例(`cursor`)、执行查询并将结果按字典形式返回供后续迭代打印出来;最后确保无论是否发生异常都能正常断开与DBMS之间的通信链路。 --
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值