SimpleCursorAdapter和ListView的結合使用


  我們在用SQLite查數據的時候,經常會用到Cursor這個游標,我們希望能將游標指向的數據直接綁定到ListView中,這樣就免去了將游標數據取出然后轉換到SimpleAdapter中的麻煩。今天我們來演示下這個適配器如何使用。

思路:通過傳統的方法執行查詢操作,返回一個Cursor,將這個游標放入到SimpleCursorAapter的構造函數中即可,最后setAdapter

MainActivity.java

package com.kale.cursoradapter;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity {

    DatabaseManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //得到一個數據層操作對象
        dbManager = new DatabaseManager(this);
        //因為在數據庫建立的時候我們已經建立一個表了,所以這里就可以直接插入數據了
        String insertSql = "insert into test_table (name,age) values('kale',20)";
        //用循環的方式來插入20條數據
        for (int i = 0; i < 20; i++) {
            dbManager.executeSql(insertSql);
        }
// 這個游標查詢到的數據中必須有一個列名為_id否則會報錯,所以寫sql語句的時候必須要查到_id。顯不顯示這個id到無所謂 String sql = "select _id,name,age from test_table";
//得到一個Cursor,這個將要放入適配器中 Cursor cursor = dbManager.executeSql(sql, null); // 最后一個參數flags是一個標識,標識當數據改變調用onContentChanged()的時候,是 // 否通知ContentProvider數據的改變,如果無需監聽ContentProvider的改變,則可以傳0。 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, new String[] { "name", "age" }, new int[] { R.id.name, R.id.age }, 0); ListView listView = (ListView) findViewById(R.id.listView); listView.setAdapter(adapter); } }

 

注意:這里查詢到的數據中必須有一列是_id,否則會報錯。所以在建表的時候就應該建立這一列。

 

 

后面兩個類基本就是直接從我之前的文章中copy過來的,方便以后使用。

數據庫對象類——DatabaseManager

package com.kale.cursoradapter;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;

public class DatabaseManager{
    
     DatabaseHelper mDbHelper = null;  
     //操作數據庫的實例
     static SQLiteDatabase mDb = null;  
     Context mContext = null;  
     
     public DatabaseManager(Context context) {
         mContext = context;  
         mDbHelper = DatabaseHelper.getInstance(mContext);  
         mDb= mDbHelper.getReadableDatabase(); 
    }
     
     /**
     * 建立表
     * SQLite內部只支持NULL,INTEGER,REAL(浮點),TEXT(文本),BLOB(大二進制)5種數據類型
     * 建立表成功了,返回true
     */
    public boolean executeSql(String sql){
         try {
             mDb.execSQL(sql);
             return true;
         }
         catch(SQLiteException e){
            return false;
         }
     }
    
    public Cursor executeSql(String sql,String[]args){
         try {
             return mDb.rawQuery(sql, args);
         }
         catch(SQLiteException e){
             e.printStackTrace();
         }
         return null;
     }
    
    /**
     * 關閉連接 
     */
    public void closeDBhelper() {
        if (mDbHelper != null) {
            mDbHelper.close();
        }
    }
     
}

 

DatabaseHelper

package com.kale.cursoradapter;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper{
    
    private static DatabaseHelper mInstance = null;
    //數據庫名字
    public static final String DATABASE_NAME = "SQLite_db";
    //版本號
    private static final int DATABASE_VERSION = 1;
    //建立默認表的語句,必須有_id這個列
    private static final String CREAT_TABLE_TABLE_SQL = "create table test_table(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,age INTEGER);"; public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }    
    
    public DatabaseHelper(Context context, String name, int version) {
        super(context, name, null, version);
    }
    
    
    public static synchronized DatabaseHelper getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new DatabaseHelper(context);
        }
        return mInstance;
    }

    /* 
     * 初次使用時創建數據庫表
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //通過sql語句建立默認表
        db.execSQL(CREAT_TABLE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        /**可以拿到當前數據庫的版本信息 與之前數據庫的版本信息   如果不同,那么就更新數據庫**/
        
    }
    //刪除數據庫
    public boolean deleteDatabase(Context context , String databaseName) {
        return context.deleteDatabase(databaseName);
    }
}

 

源碼下載:http://download.csdn.net/detail/shark0017/8026895

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM