Android實戰開發—數據庫操作類 – Android移動開發技術文章_手機開發 Android移動開發教學課程

在我們的框架中,有一個文件叫做DBTool.java,很明顯,是我們用來處理數據庫的類。在Android的開發中,我們操作的數據庫是SQLite這個小型的數據庫,一個小小的手機,當然是裝不下MSSQL或者MySQL之類的大傢夥,同時,較高的資源消耗也是移動開發中必需要註意的問題,所以一個小巧好用的數據庫也就成為瞭我們的好夥伴!

 

 

 

先匯報一下目前項目的進展,已經做瞭幾天的Model開發,也就是請求接口獲取數據。現在大部分的已經寫完瞭,主要是iphone外包公司的效果圖還未提交過來,所以我們也隻能先進行最底層的開發。等開Tools包中的東西都發上來以後,我們再來研究Model層以及XML的解析。

 

 

 

我們還是先看看完整的代碼,然後一一描述。

 

 

 

 

 

 

package hb.hbwb.tools; 

 

import hb.hbwb.finals.DBFinals; 

import android.content.ContentValues; 

import android.content.Context; 

import android.database.Cursor; 

import android.database.SQLException; 

import android.database.sqlite.*; 

 

/**

 * @name 數據庫相關操作類

 * @author zhang.yue

 * @create_date 20110512

 * @last_edit_author zhang.yue

 * @last_edit_date 20111115

 * @remark

 * @edit_remark 優化代碼

 */ 

public class DBTool { 

    private Context mCtx = null; 

    private DatabaseHelper dbHelper = null; 

    private SQLiteDatabase db = null;    

    /**

     * 構造函數   1

     * @param ctx context對象

     */ 

    public DBTool(Context ctx){ 

        this.mCtx = ctx; 

    } 

     

    /**

     * 打開數據連接

     * @return

     * @throws SQLException

     */ 

    public DBTool open() throws SQLException{ 

        dbHelper = new DatabaseHelper(mCtx); 

        db = dbHelper.getWritableDatabase();    //如果數據庫不存在就建立一個,反之存在則根據版本更新

        return this; 

    } 

     

    /**

     * 關閉數據連接

     */ 

    public void close(){ 

        dbHelper.close(); 

    } 

     

    /**

     * 列表查詢用  1

     * @param tableName 表名

     * @param strCols 列名

     * @param strWhere 條件

     * @param strGroupby 分組

     * @param strOrderby 排序

     * @return 數據指針

     */ 

    public Cursor getAll(String tableName,String[] strCols,String strWhere,String strGroupby,String strOrderby){ 

        return db.query(tableName,  //表名

                strCols,       //列

                strWhere,          //where語句

                null,          //where語句的參數

                strGroupby,          //GROUP by語句

                null,          //HAVING語句

                strOrderby           //order by語句

                ); 

    } 

 

    /**

     * 列表查詢用  2

     * @param sql 傳入sql語句直接查詢

     * @return 數據指針

     */ 

    public Cursor getAll(String sql){ 

        return db.rawQuery(sql, null); 

    } 

     

    /**

     * 單個數據查詢  1

     * @param rowId 數據id

     * @param tableName 表名

     * @param key 關鍵字

     * @param strCols 列名

     * @param strWhere 條件

     * @param strGroupby 分組

     * @param strOrderby 排序

     * @return 單個數據指針

     */ 

    public Cursor get(long rowId,String tableName,String key,String[] strCols,String strWhere,String strGroupby,String strOrderby){ 

        Cursor mCursor = db.query(  

                tableName, 

                strCols, 

                key+"="+rowId, 

                null,strGroupby,null,strOrderby); 

         

        //如果指針存在,就把指針移到第一個條目上

        if(mCursor!=null) 

            mCursor.moveToFirst(); 

         

         

        return mCursor; 

    } 

     

    /**

     * 單個數據查詢  2

     * @param sql 傳入sql語句直接查詢

     * @return 單個數據指針

     */ 

    public Cursor get(String sql){ 

        Cursor mCursor =db.rawQuery(sql, null); 

        //如果指針存在,就把指針移到第一個條目上

        if(mCursor!=null) 

            mCursor.moveToFirst(); 

         

        return mCursor; 

    } 

     

    /**

     * 更新數據

     * @param rowId 數據id

     * @param tableName 表名

     * @param key 更新列名

     * @param args 更新數據

     * @return 是否更新成功

     */ 

    public boolean update(long rowId,String tableName,String key,ContentValues args){ 

        return db.update(tableName, args, key+"="+rowId, null)>0; 

    } 

     

    /**

     * 插入新數據

     * @param tableName 表名

     * @param args 數據

     * @return 成功返回id,失敗返回-1

     */ 

    public long create(String tableName,ContentValues args){ 

        //                 表名           ,不重要,內容值

        return db.insert(tableName, null, args); 

    } 

     

    /**

     * 刪除數據

     * @param rowId 數據id

     * @param tableName 表名

     * @param key 關鍵字

     * @return 是否刪除成功

     */ 

    public boolean delete(long rowId,String tableName,String key){ 

        return db.delete(tableName, key+"="+rowId, null)>0; 

    } 

     

     

    /**

     * @name DBTool內部類,用於創建和更新數據庫

     * @author zhang.yue

     * @create_date 2011-11-15

     * @last_edit_author 

     * @last_edit_date 

     * @remark 

     * @edit_remark

     */ 

    public static class DatabaseHelper extends SQLiteOpenHelper{ 

        /**

         * 構造函數

         * @param context context數據

         */ 

        public DatabaseHelper(Context context) { 

            //   對象           ,數據庫名               ,復雜查詢    ,數據庫版本

            super(context, DBFinals.DATABASE_NAME, null, DBFinals.DBTABASE_VERSION); 

        } 

     

        /**

         * 重寫onCreate方法,建立數據庫

         */ 

        @Override 

        public void onCreate(SQLiteDatabase db) { 

            db.execSQL(DBFinals.DBUser.DATABASE_TABLE_USER_CREATE); 

        } 

     

        /**

         * 重寫onUpgrade方法,根據版本號不同(DBTABASE_VERSION)更新數據庫

         */ 

        @Override 

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

            db.execSQL("DROP TABLE IF EXISTS "+DBFinals.DBUser.DATABASE_TABLE_USER); 

            onCreate(db); 

        } 

    } 

 

 

 

1、  在這個類中,有一個內部類,叫做DatabaseHelper,繼承自SQLiteOpenHelper。SQLiteOpenHelper是Google為我們準備好的用來連接、創建數據庫的基類。我們隻要重寫其中的onCreate和onUpgrade方法,分別是用來創建數據庫以及根據版本號更新數據庫。建庫的語句放在瞭DBFinals.DBUser.DATABASE_TABLE_USER_CREATE中作為一個常量。

 

 

 

2、  DBTool這個類,是我們用於進行數據庫操作的類。

 

①   Open方法:創建DatabaseHelper對象,新建或者更新數據庫,他的getWritableDatabase方法的作用是如果數據庫不存在就建立一個,反之存在則根據版本更新。

 

 

 

②   Close方法:關閉DatabaseHelper對象建立的連接。

 

 

 

③   getAll方法:查詢列表,這裡重載瞭這個方法,一個是SQLiteDatabase對象自帶的query方法,可以看出分別傳入瞭不同的參數,其實類似於Hibernate或Linq。另一個方法rawQuery則是根據sql語句來進行查詢。說實話,自己用後者更多一些!這兩個方法返回的均是Cursor類型的指針。需要通過cusor. mCursor.moveToNext()移動指針來獲取數據。

 

 

 

④   get方法:類似於查詢列表,不過這裡直接將返回的指針的第一條數據取瞭出來,而不是將整個Cursor指針列表返回。同樣用兩種方式重載。

 

 

 

⑤   update方法:更新數據,使用的是SQLiteDatabase對象自帶的update方法,需要按規范傳參數,返回佈爾值。

 

 

 

⑥   create方法:與update方法類似,返回的是創建後的數據id,失敗返回-1。

 

 

 

⑦   delete方法:與update方法類似。

 

 

 

具體的調用方法我們在將來的前臺操作中再說,不過心急的朋友可以直接用用試試,基本上都是是網絡和各種教程中比較常見的一些方法。

 

摘自 壞小子

發佈留言