Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android打造屬於自己的數據庫操作類。

Android打造屬於自己的數據庫操作類。

編輯:關於Android編程

1、概述

開發Android的同學都知道sdk已經為我們提供了一個SQLiteOpenHelper類來創建和管理SQLite數據庫,通過寫一個子類去繼承它,就可以方便的創建、管理數據庫。但是當我們需要去做增刪改查的操作的時候,就得通過getWritableDatabase獲取一個SQLiteDataBase,然後老老實實去寫操作值的put以及查詢返回的Cursor處理,其實我們可以搞一個對象來幫我們干這些事情,打造屬於你自己的數據庫操作類。

2、操作類的初顯形

假設現在我們什麼都沒有,我們要去搞一個對象來給我們干這件事情,它需要有什麼才可以干呢?
先想想要做的事情:管理數據庫的操作
那要做數據庫的操作需要什麼就很簡單了吧?
1、要操作數據庫,所以需要一個SQLiteDataBase對象,可以通過SQLiteOpenHelper的子類來獲取。
2、此外數據庫要創建,還需要數據庫信息吧?那就直接變量引入。
3、有了數據庫信息,創建了數據庫,你要操作,怎麼也得告訴我操作哪個表。所以還得包含創建表和更新表的信息,由於表一般會有多張,所以這裡用一個數組變量。

有了信息還得交互,不然我怎麼知道你要怎麼創建表,所以我們在構造方法中直接獲取這些信息。

接下看上面文字的代碼表示

public abstract class DataBaseHelper {

     /**
     * 用來創建和獲取數據庫的SQLiteOpenHelper
     */
    protected DBHelper mDbHelper;
    /**
     * 數據庫對象
     */
    protected SQLiteDatabase mDb;

    /**
     * 數據庫信息
     */
    private int mDbVersion;//版本
    private String mDbName;//數據庫名
    /**
     * 創建表語句
     */
    private String[] mDbCreateSql;
    /**
     * 更新表語句
     */
    private String[] mDbUpdateSql;

    protected abstract int getMDbVersion(Context context);

    protected abstract String getDbName(Context context);

    protected abstract String[] getDbCreateSql(Context context);

    protected abstract String[] getDbUpdateSql(Context context);

    public DataBaseHelper(Context context) {
        this.mDbVersion = this.getMDbVersion(context);
        this.mDbName = this.getDbName(context);
        this.mDbCreateSql = this.getDbCreateSql(context);
        this.mDbUpdateSql = this.getDbUpdateSql(context);
        this.mDbHelper = new DBHelper(context,this.mDbName,null,this.mDbVersion);
    }

    protected void open(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                mDb = mDbHelper.getWritableDatabase();
            }
        }).start();

    }

    protected SQLiteDatabase getDB(){
        return this.mDb;
    }


    public void close(){
        this.mDb.close();
        this.mDbHelper.close();
    }

    private class DBHelper extends SQLiteOpenHelper{

        public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String[] arr = DataBaseHelper.this.mDbCreateSql;
            //執行創建表語句
            for (int i=0;i

代碼比較簡單,包含了進行數據庫操作要用到的各種信息,並且在初始化的進行了賦值。同時還提供了SQLiteDatabase的open、close。同時在這裡用到了抽象方法是因為考慮創建多個數據庫的情況,讓子類來提供具體的數據庫信息,我只管做創建和操作就行了。

這裡我們的數據庫操作類已經初顯雛形了,但是現在除了創建表還沒什麼用。操作類不提供簡便的操作還叫什麼操作類,下面就來說說操作。

我們要做操作類,無非是要簡化操作,就像當老板一樣。我告訴你一些用到的東西,你去給我完成這個事情。哈哈。

假如我現在就是要操作數據庫的老板,那我其實只想告訴你必要的事情,其它的我都不想做。

那麼必要的信息只有表名,要操作的字段和值,如果是刪除、更新、和查詢的話多加個篩選條件。接下來看代碼


 /**
     * 統一對ContentValues處理
     * @param contentValues
     * @param key
     * @param value
     */
    private void ContentValuesPut(ContentValues contentValues,String key,Object value){
        if (value==null){
            contentValues.put(key,"");
        }else{
            String className = value.getClass().getName();
            if (className.equals("java.lang.String")){
                contentValues.put(key,value.toString());
            } else if (className.equals("java.lang.Integer")){
                contentValues.put(key,Integer.valueOf(value.toString()));
            } else if (className.equals("java.lang.Float")){
                contentValues.put(key,Float.valueOf(value.toString()));
            } else if (className.equals("java.lang.Double")){
                contentValues.put(key,Double.valueOf(value.toString()));
            } else if (className.equals("java.lang.Boolean")){
                contentValues.put(key,Boolean.valueOf(value.toString()));
            } else if (className.equals("java.lang.Long")){
                contentValues.put(key,Long.valueOf(value.toString()));
            } else if (className.equals("java.lang.Short")){
                contentValues.put(key,Short.valueOf(value.toString()));
            }
        }
    }

    /**
     * 根據數組的列和值進行insert
     * @param tableName
     * @param columns
     * @param values
     * @return
     */
    public boolean insert(String tableName,String[] columns,Object[] values){
        ContentValues contentValues = new ContentValues();
        for (int rows = 0; rows < columns.length;++rows){
             ContentValuesPut(contentValues,columns[rows],values[rows]);
        }
        long rowId = this.mDb.insert(tableName,null,contentValues);
        return rowId!=-1;
    }

    /**
     * 根據map來進行insert
     * @param tableName
     * @param columnValues
     * @return
     */
    public boolean insert(String tableName,Map columnValues){
        ContentValues contentValues = new ContentValues();
        Iterator iterator = columnValues.keySet().iterator();
        while (iterator.hasNext()){
            String key = (String) iterator.next();
            this.ContentValuesPut(contentValues,key,columnValues.get(key));
        }

        long rowId = this.mDb.insert(tableName,null,contentValues);
        return rowId!=-1;
    }


    /**
     * 統一對數組where條件進行拼接
     * @param whereColumns
     * @return
     */
    private String initWhereSqlFromArray(String[] whereColumns){
        StringBuffer whereStr = new StringBuffer();
        for (int i=0;i whereParams){
        Set set = whereParams.keySet();
        String[] temp = new String[whereParams.size()];
        int i = 0;
        Iterator iterator = set.iterator();
        StringBuffer whereStr = new StringBuffer();
        while (iterator.hasNext()){
            String key = (String) iterator.next();
            whereStr.append(key).append(" = ? ");
            temp[i] = whereParams.get(key);
            if (i 0 ;
    }

    /**
     * 根據map值來進行update
     * @param tableName
     * @param columnValues
     * @param whereParam
     * @return
     */
    public boolean update(String tableName,Map columnValues,Map whereParam){
        ContentValues contentValues = new ContentValues();
        Iterator iterator = columnValues.keySet().iterator();

        String columns;
        while (iterator.hasNext()){
            columns = (String) iterator.next();
            ContentValuesPut(contentValues,columns,columnValues.get(columns));
        }

        Map map = this.initWhereSqlFromMap(whereParam);
        int rowNumber = this.mDb.update(tableName,contentValues,(String)map.get("whereSql"),(String[]) map.get("whereSqlParam"));
        return rowNumber > 0;
    }

    /**
     * 根據數組條件進行delete
     * @param tableName
     * @param whereColumns
     * @param whereParam
     * @return
     */
    public boolean delete(String tableName,String[] whereColumns,String[] whereParam){
        String whereStr = this.initWhereSqlFromArray(whereColumns);
        int rowNumber = this.mDb.delete(tableName,whereStr,whereParam);
        return rowNumber > 0;
    }


    /**
     * 根據map來進行delete
     * @param tableName
     * @param whereParams
     * @return
     */
    public boolean delete(String tableName,Map whereParams){
        Map map = this.initWhereSqlFromMap(whereParams);
        int rowNumber = this.mDb.delete(tableName,map.get("whereSql").toString(),(String[]) map.get("whereSqlParam"));
        return rowNumber > 0;
    }


    /**
     * 查詢返回List
     * @param sql
     * @param params
     * @return
     */
    public List queryListMap(String sql,String[] params){
        ArrayList list = new ArrayList();
        Cursor cursor = this.mDb.rawQuery(sql,params);
        int columnCount = cursor.getColumnCount();
        while (cursor.moveToNext()){
            HashMap item = new HashMap();
            for (int i=0;i

上面的操作代碼就完畢了,這裡主要對增刪改的參數是數組和Map的情況進行了處理,對查詢的結果進行了處理,代碼比較簡單也都有注釋,這裡就不做特別說明了。到這裡一個數據庫操作類就成型了。

3、操作類的繼續完善

通過上面的過程已經可以使用了,那麼先來看看使用,我們只需要繼承操作抽象類告訴它具體的數據庫信息以及建表語句。

public class TestDBHelper extends DataBaseHelper {

    private static TestDBHelper mTestDBHelper;

    private TestDBHelper(Context context){
        super(context);
    }

    public static TestDBHelper getInstance(Context context){
        if (mTestDBHelper==null){
            synchronized (DataBaseHelper.class){
                if (mTestDBHelper==null){
                    mTestDBHelper = new TestDBHelper(context);
                    if (mTestDBHelper.getDB()==null||!mTestDBHelper.getDB().isOpen()){
                        mTestDBHelper.open();
                    }
                }
            }
        }
        return mTestDBHelper;
    }

    @Override
    protected int getMDbVersion(Context context) {
        return 1;
    }

    @Override
    protected String getDbName(Context context) {
        return "test.db";
    }

    @Override
    protected String[] getDbCreateSql(Context context) {
        String[] a = new String[1];
        a[0] = "CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,gender TEXT,age INTEGER)";
        return a;
    }

    @Override
    protected String[] getDbUpdateSql(Context context) {
        return new String[0];
    }
}

重寫父類的抽象方法告訴它數據庫信息以及建表語句,然後提供一個單例供外部獲取,如果沒有open就open數據庫,接下來看看使用

4、使用

直接獲取,然後傳入你想操作的表信息,So Easy!

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button selectBtn;
    private Button insertBtn;
    private Button updateBtn;
    private Button deleteBtn;
    private TextView contentTv;

    private TestDBHelper testDBHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        testDBHelper = TestDBHelper.getInstance(getApplicationContext());

        selectBtn = (Button) findViewById(R.id.select_btn);
        insertBtn = (Button) findViewById(R.id.insert_btn);
        updateBtn = (Button) findViewById(R.id.update_btn);
        deleteBtn = (Button) findViewById(R.id.delete_bt);
        contentTv = (TextView) findViewById(R.id.content_tv);


        selectBtn.setOnClickListener(this);
        insertBtn.setOnClickListener(this);
        updateBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.select_btn:
                List list = testDBHelper.queryListMap("select * from user",null);
                contentTv.setText(String.valueOf(list));
                break;
            case R.id.insert_btn:
                testDBHelper.insert("user",new String[]{"name","gender","age"},new Object[]{"qiangyu","male",23});
                break;
            case R.id.update_btn:
                testDBHelper.update("user",new String[]{"name","gender","age"},new Object[]{"yangqiangyu","male",24},
                        new String[]{"name"},new String[]{"qiangyu"});
                break;
            case R.id.delete_bt:
                testDBHelper.delete("user",
                        new String[]{"name"},new String[]{"qiangyu"});
                break;
        }
    }
}

很簡單了,附一張演示圖
gif制作了做了壓縮,圖的效果不好請見諒
這裡寫圖片描述
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="hljs java">是不是簡單多了

yissan的博客,未經允許嚴禁轉載 http://blog.csdn.net/yissan

5、最後的完善

在第3步裡,我們的數據庫信息,和建表語句都是寫在具體的代碼裡的,這樣我們每次修改都要動代碼。Android推薦我們這些具體的信息都寫在配置文件xml裡面,那麼我們就來做一下修改。

建立一個db.xml




    
        test.db
        1
    

    
        CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,gender TEXT,age INTEGER)
    

    
        
    

現在的獲取數據信息的代碼是這樣

 @Override
    protected int getMDbVersion(Context context) {
        return Integer.valueOf(context.getResources().getStringArray(R.array.DATABASE_INFO)[1]);
    }

    @Override
    protected String getDbName(Context context) {
        return context.getResources().getStringArray(R.array.DATABASE_INFO)[0];
    }

    @Override
    protected String[] getDbCreateSql(Context context) {
        return context.getResources().getStringArray(R.array.CREATE_TABLE_SQL);
    }

    @Override
    protected String[] getDbUpdateSql(Context context) {
        return context.getResources().getStringArray(R.array.UPDATE_TABLE_SQL);
    }

從配置文件當中獲取數據庫信息,這樣以後每次修改只需要修改xml文件就可以了。

6、結語

到此,一個數據庫操作類就完成啦,當然你可以根據自己的需要在其實添加更多的便捷操作方法。

這裡提供的操作類,在使用的時候我們還在需要在Activity中寫一些查詢的sql代碼,我們可以再搞一個統一做各種具體操作表的對象。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved