掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了。不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作。

我们都知道 SQL 的全称是 Structured Query Language,翻译成中文就是结构化查询语言。 它的大部功能都是体现在“查”这个字上的,而“增删改”只是其中的一小部分功能。由于 SQL 查询涉及的内容实在是太多了,因此在这里我不准备对它展开来讲解,而是只会介绍 Android 上的查询功能。如果你对 SQL 语言非常感兴趣,可以找一本专门介绍 SQL 的书进 行学习。

相信你已经猜到了,SQLiteDatabase 中还提供了一个 query()方法用于对数据进行查询。 这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数。那我们就先来看一下 这七个参数各自的含义吧,第一个参数不用说,当然还是表名,表示我们希望从哪张表中查 询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个 参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参 数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参 数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用 于指定查询结果的排序方式,不指定则表示使用默认的排序方式。更多详细的内容可以参考 下表。其他几个 query()方法的重载其实也大同小异,你可以自己去研究一下,这里就不再 进行介绍了。

query()方法参数

对应 SQL 部分

描述

table

from table_name

指定查询的表名

columns

select column1, column2

指定查询的列名

selection

where column = value

指定 where 的约束条件

selectionArgs

-

为 where 中的占位符提供具体的值

groupBy

group by column

指定需要 group by 的列

having

having column = value

对 group by 后的结果进一步约束

orderBy

order by column1, column2

指定查询结果的排序方式

虽然 query()方法的参数非常多,但是不要对它产生畏惧,因为我们不必为每条查询语

句都指定上所有的参数,多数情况下只需要传入少数几个参数就可以完成查询操作了。调用

query()方法后会返回一个 Cursor 对象,查询到的所有数据都将从这个对象中取出。
下面还是让我们通过例子的方式来体验一下查询数据的具体用法,修改 activity_main.xml

中的代码,如下所示:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="vertical" >

……

<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="Query
data"
/>

</LinearLayout>

这个已经没什么好说的了,添加了一个按钮用于查询数据。然后修改 MainActivity 中的 代码,如下所示:

public class MainActivity extends
Activity {

private MyDatabaseHelper dbHelper;

@Override

protected
void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);

……

Button queryButton = (Button) findViewById(R.id.query_data);

queryButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

// 查询Book表中所有的数据

Cursor cursor = db.query("Book",
null, null, null, null, null, null);

if (cursor.moveToFirst()) {

do {

// 遍历Cursor对象,取出数据并打印

String name =
cursor.getString(cursor. getColumnIndex("name"));

String author = cursor.getString(cursor.

getColumnIndex("author"));

int pages = cursor.getInt(cursor.getColumnIndex("pages"));

double price = cursor.getDouble(cursor.

getColumnIndex("price"));

Log.d("MainActivity",
"book name is " + name); Log.d("MainActivity", "book author is "
+ author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);

}

while (cursor.moveToNext());

}});}

}

cursor.close();

}

可以看到,我们首先在查询按钮的点击事件里面调用了 SQLiteDatabase 的 query()方法 去查询数据。这里的 query()方法非常简单,只是使用了第一个参数指明去查询 Book 表,后 面的参数全部为 null。这就表示希望查询这张表中的所有数据,虽然这张表中目前只剩下一 条数据了。查询完之后就得到了一个 Cursor 对象,接着我们调用它的 moveToFirst()方法将数据的指针移动到第一行的位置,然后进入了一个循环当中,去遍历查询到的每一行数据。在这个循环中可以通过 Cursor 的 getColumnIndex()方法获取到某一列在表中对应的位置索引,
然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了。接着我
们使用
Log 的方式将取出的数据打印出来,借此来检查一下读取工作有没有成功完成。最后
别忘了调用 close()方法来关闭 Cursor。

好了,现在再次重新运行程序,界面如图 6.27 所示。

图   6.27

点击一下 Query data 按钮后,查看 LogCat 的打印内容,结果如图 6.28
所示。

图   6.28

可以看到,这里已经将 Book 表中唯一的一条数据成功地读取出来了。

android: SQLite查询数据的更多相关文章

  1. android: SQLite添加数据

    现在你已经掌握了创建和升级数据库的方法,接下来就该学习一下如何对表中的数据进 行操作了.其实我们可以对数据进行的操作也就无非四种,即 CRUD.其中 C 代表添加 (Create),R 代表查询(Re ...

  2. android: SQLite删除数据

    删除数据对你来说应该就更简单了,因为它所需要用到的知识点你全部已经学过了. SQLiteDatabase 中提供了一个 delete()方法专门用于删除数据,这个方法接收三个参数,第一 个参数仍然是表 ...

  3. android: SQLite更新数据

    学习完了如何向表中添加数据,接下来我们看看怎样才能修改表中已有的数据. SQLiteDatabase 中也是提供了一个非常好用的 update()方法用于对数据进行更新,这个方法 接收四个参数,第一个 ...

  4. Android数据库 — — —查询数据

    package com.example.datebasetest; import android.content.ContentValues;import android.database.Curso ...

  5. sqlite 查询数据 不用回调

    int main( void ){    sqlite3 *db=NULL;    char *zErrMsg = 0;    int rc;    //打开数据库连接    rc = sqlite3 ...

  6. android sqlite导入数据

    @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { // TODO Auto-generated meth ...

  7. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  8. Android课程---关于数据存储的学习(3)之数据库和事务

    DataActivity3.java package com.hanqi.test5; import android.content.ContentValues; import android.dat ...

  9. Android SQLite数据库使用

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一. ...

随机推荐

  1. 高频交易策略之Penny Jump[z]

    高频交易策略之Penny Jump 今天假设有一个笨笨的大型机构投资人(共同基金,银行,退休基金....),他想要买进一只股票,但又不想挂市价买进,所以就在市场里面挂了一张要买进的大单.这时候所有市场 ...

  2. linux中压缩与解压缩命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...

  3. unity3d使用脚本保存屏幕截图

    using UnityEngine; using System.Collections; using System.IO; public class FrameAnimation : MonoBeha ...

  4. 返回绝对值--Math.Abs 方法

    Math.abs()  返回指定数字的绝对值.

  5. [转载] 散列表(Hash Table) 从理论到实用(下)

    转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...

  6. 咏南WEB开发框架(FOR XE10.1 BERLIN)

    咏南WEB开发框架(FOR XE10.1 BERLIN) 1)支持最新的XE10.1 BERLIN开发WEB程序 2)如同开发VCL WIN32程序一样的速度 3)WEB框架通过咏南中间件和数据库打交 ...

  7. oracle删除数据恢复

    分为两种方法:scn和时间戳两种方法恢复. 一.通过scn恢复删除且已提交的数据 1.获得当前数据库的scn号 select current_scn from v$database; (切换到sys用 ...

  8. 短信转发Q群

    ※◆☆★☆◆※欢迎使用!!!如有问题或新功能需求请联系作者QQ:82850696*4*您使用的测试版已到期,如需继续使用,请联系作者 QQ : 82850696*0*2015-1-7 23:59:59 ...

  9. 【转】 全世界最短的IE判定

    以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的. var ie = !+"\v1"; 仅仅需要7bytes!讲述外国人是如何把IE的判定从32 bytes一步步缩简成7 ...

  10. windows all version - 实现指定路径共享

    调用API函数NetShareAdd()将文件夹设置为共享,调用此函数后如果不做其他设置,网络用户是无法访问共享文件夹的,因为此文件夹在NTFS分区中,同时受到NTFS文件系统的访问控制,因此还需要第 ...