SimpleCursorAdapter類與數據綁定

 在許多時候需要將數據庫表中的數據顯示在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目錄中創建數據庫文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章