Android之数据持久化三(sqllite数据库)三

Android之数据持久化三(sqllite数据库)三

一,查询数据

终于到了最后一种操作了,掌握了查询数据的方法之后,你也就将数据库的 CRUD 操
作全部学完了。不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种
操作。
我们都知道 SQL 的全称是 Structured Query Language, 翻译成中文就是结构化查询语言。
它的大部功能都是体现在“查”这个字上的,而“增删改”只是其中的一小部分功能。由于
SQL 查询涉及的内容实在是太多了,因此在这里我不准备对它展开来讲解,而是只会介绍
Android 上的查询功能。如果你对 SQL 语言非常感兴趣,可以找一本专门介绍 SQL 的书进
行学习。
相信你已经猜到了,SQLiteDatabase中还提供了一个 query()方法用于对数据进行查询。
这个方法的参数非常复杂,最短的一个方法重载也需要传入七个参数。那我们就先来看一下
这七个参数各自的含义吧,第一个参数不用说,当然还是表名,表示我们希望从哪张表中查
询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个
参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参
数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参
数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用
于指定查询结果的排序方式,不指定则表示使用默认的排序方式。更多详细的内容可以参考
下表。其他几个 query()方法的重载其实也大同小异,你可以自己去研究一下,这里就不再
进行介绍了。


虽然 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。

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


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


二,使用 SQL 操作数据库

Android 充分考虑到了你们
的编程习惯,同样提供了一系列的方法,使得可以直接通过 SQL 来操作数据库。
下面我就来简略演示一下, 如何直接使用 SQL 来完成前面几小节中学过的 CRUD 操作。
添加数据的方法如下:

db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
//更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
//删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
//查询数据的方法如下:
db.rawQuery("select * from Book", null);

可以看到,除了查询数据的时候调用的是 SQLiteDatabase 的 rawQuery()方法,其他的操
作都是调用的 execSQL()方法。以上演示的几种方式,执行结果会和前面几小节中我们学习
的 CRUD 操作的结果完全相同,选择使用哪一种方式就看你个人的喜好了。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值