博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据存储】数据查询与Cursor接口(4)
阅读量:6278 次
发布时间:2019-06-22

本文共 8511 字,大约阅读时间需要 28 分钟。

     Cursor接口就非常类似于在JDBC中的Result接口,也是用于进行数据的结果接收的。

 当android程序需要进行数据检索操作时,需要保存全部查询结果,而保存查询结果就是可以使用android.database.Cursor接口完成,且可以完成对结果集随机读写访问的操作。

 

下面使用Cursor接口并结合SQLiteDatabase类完成数据查询操作,所有查询结果通过ListView进行显示。

 

实例:定义数据库查询操作类-----MytabCursor.java

 

 

import java.util.ArrayList;import java.util.List;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MytabCursor {    private static final String TABLENAME = "mytab" ;    private SQLiteDatabase db = null ;    public MytabCursor(SQLiteDatabase db) {        this.db = db ;    }    public List
find(){ // 此时只是String List
all = new ArrayList
() ; String sql = "SELECT id,name,birthday FROM " + TABLENAME ; // 执行查询语句 Cursor result = this.db.rawQuery(sql, null); // 采用循环的方式检索数据 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { all.add("【" + result.getInt(0) + "】" + " " + result.getString(1) + "," + result.getString(2)); } this.db.close() ; return all ; }}
View Code

 

定义Activity程序,显示所有数据

 

 

import android.app.Activity;import android.database.sqlite.SQLiteOpenHelper;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.LinearLayout;import android.widget.ListView;public class MySQLiteDemo extends Activity {    private Button findBut = null ;    private SQLiteOpenHelper helper = null ;    private LinearLayout mylayout = null ;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        super.setContentView(R.layout.main);        this.findBut = (Button) super.findViewById(R.id.findBut) ;        this.mylayout = (LinearLayout)                    super.findViewById(R.id.mylayout) ;        this.findBut.setOnClickListener(new OnClickListenerImpl()) ;    }    private class OnClickListenerImpl implements OnClickListener{        @Override        public void onClick(View v) {            MySQLiteDemo.this.helper = new                       MyDatabaseHelper(MySQLiteDemo.this);            ListView listView = new ListView(MySQLiteDemo.this) ;            // 要设置数据            listView.setAdapter(                        // 所有的数据是字符串                    new ArrayAdapter
( // 上下文对象 MySQLiteDemo.this, // 列表显示的布局 android.R.layout.simple_list_item_1, // 实例化查询 new MytabCursor( // 取得SQLiteDatabase对象 // 调用find()方法,返回List
; MySQLiteDemo.this.helper .getReadableDatabase()).find())); MySQLiteDemo.this.mylayout.addView(listView) ; } }}
View Code

 

布局文件 ----- main.xml 

 

 

View Code

 

 

 

范例:SQLiteProject(使用内建query()方法)

 

 

import java.util.ArrayList;import java.util.List;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MytabCursor {    private static final String TABLENAME = "mytab" ;    private SQLiteDatabase db = null ;    public MytabCursor(SQLiteDatabase db) {        this.db = db ;    }    public List
find(){ // 此时只是String List
all = new ArrayList
() ; String columns[] = new String[] { "id", "name", "birthday" }; // 这些条件根据自己的情况增加 Cursor result = this.db.query( TABLENAME, columns, null, null, null,null, null); // 采用循环的方式检索数据 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { all.add("【" + result.getInt(0) + "】" + " " + result.getString(1) + "," + result.getString(2)); } this.db.close() ; return all ; } 在Result接口中取得列内容getXxx(),索引下标从1开始; } 在Cursor接口中,列的下标从0开始;
View Code

 

 

 

 

这种需要向query()传递多个参数,本身并不方便,而使用rawQuery()却可以直接使用SQL查询语句,这才是一种较为正确的做法,所以在进行开发时只需要记住rawQuery()即可。

 

范例:SQLiteProject(使用SQL模糊查询)

 

 

import java.util.ArrayList;import java.util.List;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MytabCursor {    private static final String TABLENAME = "mytab" ;    private SQLiteDatabase db = null ;    public MytabCursor(SQLiteDatabase db) {        this.db = db ;    }    public List
find(){ // 此时只是String List
all = new ArrayList
() ; String sql = "SELECT id,name,birthday FROM " + TABLENAME + " WHERE name LIKE ? OR birthday LIKE ?" ; // 查询关键字 ,应该由方法定义 String keyWord = "3" ; String args[] = new String[] { "%" + keyWord + "%", "%" + keyWord + "%" }; // 执行查询语句 Cursor result = this.db.rawQuery(sql, args); // 采用循环的方式检索数据 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { all.add("【" + result.getInt(0) + "】" + " " + result.getString(1) + "," + result.getString(2)); } this.db.close() ; return all ; }}
View Code

 

 

 

 

范例:SQLiteProject(内建query()模糊查询)  操作较复杂,不建议使用

 

 

import java.util.ArrayList;import java.util.List;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MytabCursor {    private static final String TABLENAME = "mytab" ;    private SQLiteDatabase db = null ;    public MytabCursor(SQLiteDatabase db) {        this.db = db ;    }    public List
find(){ // 此时只是String List
all = new ArrayList
() ; String columns[] = new String[] { "id", "name", "birthday" }; // 查询关键字 ,应该由方法定义 String keyWord = "3" ; String selectionArgs[] = new String[] { "%" + keyWord + "%", "%" + keyWord + "%" }; String selection = "name LIKE ? OR birthday LIKE ?" ; // 这些条件根据自己的情况增加 Cursor result = this.db.query(TABLENAME, columns, selection, selectionArgs, null,null, null); // 采用循环的方式检索数据 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { all.add("【" + result.getInt(0) + "】" + " " + result.getString(1) + "," + result.getString(2)); } this.db.close() ; return all ; }}
View Code

 

程序中定义了三个新变量:

   columns:设置WHERE的查询语句。

   selection:设置所有占位符的参数内容。

   selectionArgs:设置所要显示的查询列。

 

 

范例:SQLiteProject(分页显示)

 

 

import java.util.ArrayList;import java.util.List;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class MytabCursor {    private static final String TABLENAME = "mytab" ;    private SQLiteDatabase db = null ;    public MytabCursor(SQLiteDatabase db) {        this.db = db ;    }    public List
find(){ // 此时只是String List
all = new ArrayList
() ; // 现在在第一页 int currentPage = 2 ; // 每页显示5条记录 int lineSize = 5 ; String sql = "SELECT id,name,birthday FROM " + TABLENAME + " WHERE (name LIKE ? OR birthday LIKE ?) LIMIT ?,?"; // 查询关键字 ,应该由方法定义 String keyWord = "李" ; String args[] = new String[] { "%" + keyWord + "%", "%" + keyWord + "%", String.valueOf((currentPage - 1) * lineSize), String.valueOf(lineSize) }; // 是设置参数 // 执行查询语句 Cursor result = this.db.rawQuery(sql, args); // 采用循环的方式检索数据 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { all.add("【" + result.getInt(0) + "】" + " " + result.getString(1) + "," + result.getString(2)); } this.db.close() ; return all ; }}
View Code

 

本程序首先定义了currentPage和lineSize 两个用于进行分页显示控制的变量,随后将这两个变量的内容设置到了查询的参数中。本程序只是一个Demo,而实际的开发代码,要有MytabCursor类的find()接收keyWord、currentPage、lineSize这三个参数后进行查询的控制。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://zcyva.baihongyu.com/

你可能感兴趣的文章
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>