安卓里用Cursor和ResultSet查数据,其实就这么简单

ChatGPT2026-04-24 01:48:5140

温馨提示:在 ChatGPT 官网(www.chatgpt.com)使用 GPT-5.5、ChatGPT-Image-2 等模型时,需要 ChatGPT Plus 或更高等级的会员权限。如需购买账号或充值会员,请扫码添加我们客服咨询。

在安卓开发中,使用 Cursor 和 ResultSet 查询数据非常简单,首先通过 ContentResolver 的 query() 方法获取 Cursor 对象,它指向查询结果集的第一条记录之前,接着调用 moveToFirst() 方法移动到第一条数据,然后通过循环遍历所有记录,在每次循环中,使用 getColumnIndex() 获取指定列名的索引,再通过 getString()、getInt() 等方法提取具体字段值,Cursor 提供了高效的数据读取方式,支持数据库查询结果的逐行处理,最后务必调用 close() 关闭 Cursor 以释放资源,整个过程避免了手动管理数据集的复杂性,让数据检索变得直观且高效。

本文目录导读:

  1. 第一部分:先说清楚一个最基本的东西——我们从哪拿数据?
  2. 第二部分:Cursor是什么?它就是一个“光标”或者“指针”
  3. 第三部分:那ResultSet又是什么?
  4. 给小白用户的几个真心建议

很多刚学安卓开发的朋友,一听到“Cursor”和“ResultSet”这两个词,就觉得头大,感觉是很复杂、很深奥的东西,其实完全不是这样,你可以把它们想象成一个表格,或者一个清单。

今天这篇文章,我就用最笨的办法,从一个小白的角度,给你把这两个东西彻底讲明白,我们不谈那些复杂的底层原理,就谈它们到底怎么用,怎么帮你拿到数据。

第一部分:先说清楚一个最基本的东西——我们从哪拿数据?

在安卓程序里,我们经常要把数据存起来,比如你做一个记笔记的App,笔记内容要存到手机里,最常用的办法就是用一个叫“SQLite”的小数据库,你可以把SQLite想象成一个放在你手机里的Excel文件,里面有很多个表格。

当你想从这些表格里“读”出数据的时候,比如读出你昨天写的所有笔记,你就需要发出一个“查询命令”,这个命令在安卓里通常是一段SQL语句,看起来像这样:SELECT * FROM notes,意思是“把notes这个表里的所有东西都给我”。

这个命令发出去之后,数据库就会给你一个“答复”,这个“答复”就是我们要说的主角。

第二部分:Cursor是什么?它就是一个“光标”或者“指针”

“Cursor”这个名字其实很形象,你可以把它想象成图书馆里的一本书,当你去图书馆找书时,你有一个可以移动的小卡片,这个小卡片能告诉你现在看到第几本书了,这本书叫什么名字,作者是谁。

在安卓里,Cursor就是那个小卡片。

当你执行了 SELECT 语句后,数据库返回的不是一堆乱码,而是一个 Cursor 对象,这个 Cursor 对象指向了数据库返回的结果集,一开始,这个“小卡片”是放在结果集的第一行之前的,你需要告诉它:“往前走一步”,它才会移动到第一行数据上。

那具体怎么用Cursor呢? 我们一步一步说,这是最关键的。

第一步:拿到Cursor 这是最开始的起点,你需要通过一个叫 SQLiteDatabase 的东西来查询数据库,代码大概是这样:

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM notes", null);

这个 cursor 变量就是我们的小卡片,它现在手里虽然没有数据,但它知道数据在哪里。

第二步:让Cursor动起来 拿到Cursor之后,它指向“第一行之前”,如果你想看第一行数据,你就要让它移动一次,最常用的命令是 moveToFirst()

if (cursor.moveToFirst()) {
    // 这里说明成功移动到了第一行,可以开始读数据了
}

如果查出来有数据,moveToFirst() 会返回 true,Cursor就停在了第一行,如果没有数据,它返回 false,我们就不用处理了。

第三步:从当前位置读数据 当Cursor停在某一行时,你就能读这一行的每一个“列”了,比如你的笔记表里有三个列:id(编号),title),content),你要怎么拿到某一个数据呢?

你需要知道这个数据在第几列。id 是第0列(计算机里数数从0开始),title 是第1列,content 是第2列。

然后你可以用Cursor提供的方法来取:

  • cursor.getInt(0) 拿到第一列(id)的数字
  • cursor.getString(1) 拿到第二列(title)的文字
  • cursor.getString(2) 拿到第三列(content)的文字

每次都写数字0、1、2,很容易搞混,所以有一个更好的办法,就是通过列名来取,先把列名的索引位置拿到:

int idIndex = cursor.getColumnIndex("id");Index = cursor.getColumnIndex("title");
int contentIndex = cursor.getColumnIndex("content");

然后再取数据:

int id = cursor.getInt(idIndex);
String title = cursor.getString(titleIndex);
String content = cursor.getString(contentIndex);

这样代码就清楚多了,你现在就能把这一行的数据存到你的Java对象里,或者直接显示到屏幕上。

第四步:看完一行,看下一行 一张表格里往往不止一行数据,如何看完所有行呢?用循环。moveToNext() 这个方法会让Cursor从当前位置移动到下一行,如果下一行有数据,它就返回 true,没有就返回 false

所以完整的循环读数据代码是这样的:

if (cursor.moveToFirst()) {
    do {
        // 在这里取当前行的数据
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String title = cursor.getString(cursor.getColumnIndex("title"));
        String content = cursor.getString(cursor.getColumnIndex("content"));
        // 把数据加到列表里或者打印出来
        System.out.println("ID: " + id + " Title: " + title);
    } while (cursor.moveToNext());
}

这个 do...while 循环的意思是:先走到第一行,处理完数据,然后问“还有下一行吗?”,有的话就继续,没有的话就结束。

最后一步:千万别忘了关闭Cursor Cursor在运行时会占用内存,如果你忘记关掉它,程序可能会变慢,甚至出错,所以用完一定要记得:

cursor.close();
db.close();

习惯做法是在 finally 块里做这件事,或者用Android新版本的自动关闭方式,但作为新手,你只要养成习惯:查完数据,立刻关闭Cursor和数据库。

第三部分:那ResultSet又是什么?

很多朋友会问:“我在电脑上用Java写程序时,用的是ResultSet,怎么到安卓上就成了Cursor?”

情况是这样的:ResultSet 是标准Java里用来处理数据库查询结果的东西,它在电脑上的Java程序中非常常见,比如你用JDBC连接MySQL数据库时,拿到的就是ResultSet。

但安卓的数据库系统是“SQLite”,它不是电脑上那种标准的数据库系统,为了让安卓开发者用起来更方便、更轻快,安卓自己搞了一套查询和读取数据的方式,这个方式的核心就是 Cursor

它们两个很像,但不是同一个东西。 你可以把ResultSet想象成电脑上用的那种大而全的办公椅子,Cursor就是手机上用的那种小巧轻便的折叠椅子,它们都能让你“坐上去拿东西”,但用法和接口不一样。

重点记住:

  • 在安卓App里,如果你直接用系统自带的SQLite,你拿到的永远是 Cursor,不是ResultSet。
  • 如果你在安卓项目里用了一些第三方的数据库框架(比如Room),它们底层也还是在用Cursor,只是帮你封装好了,你看不到Curson而已。

如果你是刚学安卓,就把100%的精力放在弄懂 Cursor 上就好了,不要去想ResultSet该怎么在安卓里用,因为你在安卓代码里不会直接碰到它,只有当你用“Java”写一个普通的电脑程序,连数据库时,你才会遇到ResultSet。

给小白用户的几个真心建议

  1. 别怕出错。 写处理Cursor的代码时,很容易犯“忘记移动位置”或者“列索引写错”的问题,这很正常,只要仔细看错误信息,你就能很快找到原因。

  2. 先写死数据,再查数据库。 刚开始学的时候,不要去搞复杂的数据库查询,你可以先尝试把一个已知的数据库文件(里面有几条数据)搬到你的模拟器里,然后用代码去查询、打印出来,看看能不能成功读出来。

  3. 善用日志。 在读取每一行数据后,可以用 Log.d("TAG", "id=" + id) 把数据打印到日志窗口,这样你能看到Curson是否真的读到了数据,读到了什么数据,这是最直观的调试方法。

  4. 了解“生命周期”。 Curson和Activity、Fragment的生命周期是绑定的,如果你在Activity里打开了一个Cursor,当Activity被销毁时,你最好也要关掉这个Cursor,防止内存泄露,现在安卓推荐用 CursorLoader 或者 Room 来自动管理,但作为基础,你必须理解手动关Cursor的重要性。

  5. 从SQL语句开始。 如果你对 SELECT * FROM table WHERE ... 这样的SQL语句不熟悉,那你会觉得Curson很难用,因为Curson拿到的数据完全取决于你写的SQL语句好不好,如果你想深入掌握Curson,请花点时间学习SQL的基本语法,这是值得的。

Cursor就是你在安卓世界里,从本地数据库取数据的一只手,你通过SQL告诉它“给我拿什么”,它帮你把数据搬到内存里,再用 moveToFirstgetString 等方法让你一个一个地拿,它没有你想得那么复杂,只是一个工具的说明书,只要按步骤操作,多看日志,你很快就能熟练使用它。

从今天开始,试着在你的第一个笔记App或待办事项App里,自己写一个查询功能,用Curson把数据显示出来,当你真正在屏幕上看到你从数据库里读出的文字时,那种成就感会告诉你,你已经入门了。

温馨提示:在 ChatGPT 官网(www.chatgpt.com)使用 GPT-5.5、ChatGPT-Image-2 等模型时,需要 ChatGPT Plus 或更高等级的会员权限。如需购买账号或充值会员,请扫码添加我们客服咨询。

本文链接:https://www.lexitong.com/ai/102.html

ResultSet查询数据安卓cursor与resultset

相关文章

网友评论