zoukankan      html  css  js  c++  java
  • 【数据存储】数据查询与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这三个参数后进行查询的控制。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    SSH2练习中问题之org.apache.jasper.JasperException: /findAllProductions_list.jsp(31,1) TLD又はタグファイル中のattribute指示子に従って属性itemsはどんな式も受け付けません解决方案
    关于HibernateTempleate模版很多代码可以直接使用,是开发人员不可多得选择
    Java实现权限控制之2
    struts 之 constant
    JSTL表达式之<c:forEach>
    关于事后检查和确认
    关于删除
    jcommander 解析boolean参数
    多线程
    关于proto文件的更新
  • 原文地址:https://www.cnblogs.com/androidsj/p/3129465.html
Copyright © 2011-2022 走看看