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<String> find(){ // 此时只是String List<String> all = new ArrayList<String>() ; 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 ; } }
定义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<String>( // 上下文对象 MySQLiteDemo.this, // 列表显示的布局 android.R.layout.simple_list_item_1, // 实例化查询 new MytabCursor( // 取得SQLiteDatabase对象 // 调用find()方法,返回List<String> ; MySQLiteDemo.this.helper .getReadableDatabase()).find())); MySQLiteDemo.this.mylayout.addView(listView) ; } } }
布局文件 ----- main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mylayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/findBut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="查询全部数据" /> </LinearLayout>
范例: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<String> find(){ // 此时只是String List<String> all = new ArrayList<String>() ; 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开始;
这种需要向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<String> find(){ // 此时只是String List<String> all = new ArrayList<String>() ; 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 ; } }
范例: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<String> find(){ // 此时只是String List<String> all = new ArrayList<String>() ; 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 ; } }
程序中定义了三个新变量:
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<String> find(){ // 此时只是String List<String> all = new ArrayList<String>() ; // 现在在第一页 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 ; } }
本程序首先定义了currentPage和lineSize 两个用于进行分页显示控制的变量,随后将这两个变量的内容设置到了查询的参数中。本程序只是一个Demo,而实际的开发代码,要有MytabCursor类的find()接收keyWord、currentPage、lineSize这三个参数后进行查询的控制。