【数据存储】数据查询与Cursor接口(4)

     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 ;
    }
}
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<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) ;
        }    
    }
}
View Code

 

布局文件 ----- 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>
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<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开始;
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<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 ;
    }
}
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<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 ;
    }
}
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<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 ;
    }
}
View Code

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-06-09 16:43  大米稀饭  阅读(383)  评论(0编辑  收藏  举报