阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1589|回复: 0

[转帖] SimpleCursorAdapter类与数据绑定

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-2-4 12:01:14 | 显示全部楼层 |阅读模式
         在许多时候需要将数据库表中的数据显示在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目录中创建数据库文件。
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表