掌握了查询数据的方法之后,你也就将数据库的 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. ini_set 设置php配置项 在windows和linux下的不同

    在win下,当你要include多个路径的话,你要用“:”隔开,但在linux下就使用":"隔开的.. if (substr(php_uname(), 0, 7) == " ...

  2. Okhttp https

    1. 绕过CA证书,不建议使用 private void ingoreCA() throws NoSuchAlgorithmException, KeyManagementException { SS ...

  3. Jade之注释

    注释 jade注释可以保留在编译后生成的html中,也可以不保留. jade: // 这个会保留下来 p Hello //- 这个不会保留 p World html: // 这个会保留下来 <p ...

  4. Linux 查杀进程

    ps -eaf |grep "stoporder.php" | grep -v "grep"| awk '{print $2}'|xargs kill -9 # ...

  5. mysql主主复制(双主复制)配置步骤

    以前我们介绍的都是主从复制,这里给各位介绍一个双主复制了,下面都希望两个主服务器数据自动复制的话可参考一下此文章.   MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台 ...

  6. Programming Assignment 4: 8 Puzzle

    The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了 ...

  7. 6.7 Binder机制

    Binder在Android系统中江湖地位非常之高.在Zygote孵化出system_server进程后,在system_server进程中出初始化支持整个Android framework的各种各样 ...

  8. javaWeb-mvc之利用c3p0写入数据库出现乱码

    在使用c3p0向数据库中写入中文数据时出现乱码,于是我采用了和properties中配置url一样 url=jdbc:mysql://localhost:3306/student?Unicode=tr ...

  9. linux-01Red Hat Enterprise Linux 7(RHEL7)配置静态IP地址

    为方便在学习linux readhat7,在本地安装安装了虚拟机.为能够用win7连接虚拟机的linux远程客户端操作,则需要虚拟机和win本地的网络互通: 操作如下:1.本地配置ip地址 : 2.验 ...

  10. [leetcode 19] Remove Nth Node From End of List

    1 题目 Given a linked list, remove the nth node from the end of list and return its head. For example, ...