转自【eoe:Android开发者门户http://www.eoeandroid.com/forum.php?mod=viewthread&tid=54757】
在许多时候需要将数据库表中的数据显示在ListView、Gallery等组件中。虽然可以直接使用Adapter对象处理,但工作量很大。为此,Android SDK提供了一个专用于数据绑定的Adapter类:SimpleCursorAdapter。
SimpleCursorAdapter与SimpleAdapter用法相近。只是将List对象换成了Cursor对象。而且SimpleCursorAdapter类构造方法的第四个参数from表示Cursor对象中的字段,而SimpleAdapter类构造方法的第四个参数from表示Map对象中的key。除此之外,这两个Adapter类在使用方法完全相同。
下面是SimpleCursorAdapter类构造方法定义。
public SimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to);
下例中通过SimpleCursorAdapter类将数据库表绑定在ListView上,也就是说,该ListView会显示数据表的全部记录。在绑定数据前,需要先编写一个SQLiteOpenHelper类的子类,用于操作数据库,代码如下:
  package com.li;import java.util.Random;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBService extends SQLiteOpenHelper {        private final static int DATABASE_VERSION = 1;        private final static String DATABASE_NAME = "test.db";        public DBService(Context context) {                super(context, DATABASE_NAME, null, DATABASE_VERSION);        }        @Override        public void onCreate(SQLiteDatabase db) {                 //创建表                          String sql = "CREATE TABLE [t_test](" + "[_id]AUTOINC,"                                + "[name]VARCHAR2(20) NOT NULL CONFLICT FAIL,"                                + "CONSTRAINT[sqlite_autoindex_te_test_1]PRIMARY KEY([_id]))";                db.execSQL(sql);                //向test数据库中插入20条记录                Random random = new Random();                for ( int i = 0;i<20;i++)                {                        String s = "";                        for(int j=0;j<10;j++)                        {                                char c = (char)(97+random.nextInt(26));                                s+=c;                        }                        db.execSQL("insert into t_test(name)values(?)",new Object[]{s});                                                        }        }        @Override        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        }        //执行查询语句        public Cursor query(String sql,String[] args)        {                SQLiteDatabase db = this.getReadableDatabase();                Cursor cursor = db.rawQuery(sql, args);                return cursor;        }}


本例不需要对test.db进行升级,因此,只有在DBService类中的oncreate()方法中有创建数据库表的代码。DBService类创建了一个test.db数据库文件,并在该文件中创建了t_test表。在该表中包含两个字段_id和name。其中_id是自增字段,并且是主索引。
下面编写MapsDemo类。MapsDemo类是ListActivity的子类。在该类中的oncreate()方法中创建了DBService对象,然后通过DBService类的query方法查询出t_test表中的所有记录,并返回Cursor对象。MapsDemo类的代码如下:
package com.li;     import android.app.ListActivity;    import android.database.Cursor;    import android.os.Bundle;    import android.widget.SimpleCursorAdapter;    public class MapsDemo extends ListActivity {    /** Called when the activity is first created. */    @Override     public void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         DBService dbService = new DBService(this);         //查询数据                  Cursor cursor = dbService.query("select * from t_test", null);         //绑定数据         SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter   (this,android.R.layout.simple_expandable_list_item_1,cursor,new String[]{"name"},new int[]{android.R.id.text1});         setListAdapter(simpleCursorAdapter);}}


SimpleCursorAdapter类构造方法的第四个参数表示返回Cursor对象中的字段名,第五个参数表示要将该字段的值赋给那个组件。该组件在第二个参数中指定的布局文件中定义。

注意:在绑定数据时,Cursor对象返回的记录集中必须包含一个叫"_id"的字段,否则将无法完成数据绑定。也就是说SQL语句不能是select name from t_contacts.如果在数据表中没有"_id"字段,可以采用其他方法来处理。
读到这里可能有人要问:数据存到哪里去了?系统在手机内存中的/data/data/<package name>/databases目录中创建数据库文件。

更多相关文章

  1. Android音视频 - Camera+AudioRecord采集数据
  2. 抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册
  3. [Android]使用Spring for Android改善数据交互流程
  4. 打造android ORM框架opendroid(七)——数据库升级方案
  5. 被罚 50 亿后,Google 不再强制绑定 Android 默认引擎!
  6. Android数据通信--USB通信的几种方式及使用场景

随机推荐

  1. android moudle 资源文件重命名
  2. Android(安卓)Service生命周期及用法
  3. 这个彬彬就是逊啦—才搞懂小学知识求最小
  4. Android(安卓)开源项目源码分析第一期正
  5. android中的样式主题和国际化
  6. Android数据库ORMlite框架翻译系列
  7. [置顶] Android模拟打电话应用程序实现分
  8. Kotlin生态调查:超过6成的开发者用过Kotli
  9. Android的ADB工具使用
  10. Android的Audio系统