Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 自己寫一個可用並且好用的Sqlite工具

自己寫一個可用並且好用的Sqlite工具

編輯:關於Android編程

相信很懂同學都接觸過很多開源的數據庫框架,具體的就不多說了,反正給我的感覺就是,用起來總是束手束腳的,哪怕說的再好也並沒有自己做出來的那麼趁手。另外,安卓本身對數據庫的封裝已經做得很不錯了,我覺得自己封一個易用的並且好用的工具也並沒有那麼難,那麼下面進入正題。

首先說說SQLiteOpenHelper這個工具類吧,其實這個工具類網上的教程資料很多,具體使用就不多說,主要說一下我是怎麼寫的吧。先自己寫一個DatabaseHelper類繼承SQLiteOpenHelper,這裡為了更靈活我寫了兩個構造函數。代碼如下:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String name = "ZPDB"; //數據庫名稱

    private static final int version = 1;

    public DatabaseHelper(Context context) {
        this(context, name);
    }

    public DatabaseHelper(Context context, String dbname){
        super(context, dbname, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement," +
                " name varchar(20), password varchar(20), age INTEGER)");

        db.execSQL("create table if not exists story (storyid integer primary key autoincrement," +
                "title varchar(30), content varchar(1000), date varchar(20))");
    }

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

    }
}
為什麼要寫這兩個構造函數呢,第一個我用了一個默認的數據庫名稱,第二個可以自己傳入數據庫名稱。這樣做的目的是為了滿足多數據庫操作的需要,很多同學可能遇到過這個問題,比如一個聊天app,跟每個人的聊天記錄保存在不同的文件下面,而且名字也不一樣,這裡就需要能夠自己傳入數據庫名稱了。說到不同文件下面的數據庫,我們就得用到Context(上下文對象)這個玩意了。通常情況下,直接傳入上下文對象,則數據庫默認保存到系統目錄下,而且是不可見的,那麼如何定義數據庫到指定位置呢?其實很簡單,我們自定義一個類,繼承ContextWrapper,代碼如下:
public class DatabaseContext extends ContextWrapper {

    private String path;

    public DatabaseContext(Context base, String path){
        super(base);
        this.path = path;
    }

    @Override
    public File getDatabasePath(String name) {
        //判斷是否存在sd卡
        boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
        if(!sdExist){
            return null;
        }
        else{//如果存在
            //獲取sd卡路徑
            String dbDir=android.os.Environment.getExternalStorageDirectory().toString()+"/"+path;
            String dbPath = dbDir+"/"+name;//數據庫路徑
            //判斷目錄是否存在,不存在則創建該目錄
            File dirFile = new File(dbDir);
            if(!dirFile.exists())
                dirFile.mkdirs();

            //數據庫文件是否創建成功
            boolean isFileCreateSuccess = false;
            //判斷文件是否存在,不存在則創建該文件
            File dbFile = new File(dbPath);
            if(!dbFile.exists())
            {
                try {
                    isFileCreateSuccess = dbFile.createNewFile();//創建文件
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            else {
                isFileCreateSuccess = true;
            }

            //返回數據庫文件對象
            if(isFileCreateSuccess)
                return dbFile;
            else
                return null;
        }
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode,
                                               SQLiteDatabase.CursorFactory factory) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
        return result;
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,
                                               DatabaseErrorHandler errorHandler) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
        return result;
    }

}
構造函數中的path就是你想保存的數據庫位置。那麼具體怎麼使用呢?這樣就可以了
SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path)); 或者
SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path)); 或者
SQLiteOpenHelper sqlHelper = new DatabaseHelper(new DatabaseContext (context, path), dbname);

這樣你的數據庫打開位置就是在path下面了,由於使用了SQLiteOpenHelper 這個幫助類,所以如果不存在的話就會自動幫你新建一個。

好了,數據庫幫助類以及數據庫打開位置搞定了,下面我們還要思考一個問題,那就是對數據的操作問題,數據庫無外乎增刪查改,如果每次都要重寫依次,既浪費時間也不便於擴展和調整。我們應該把這些操作進行一下統一,這樣如果有什麼大的變動我們就只需要修改一個地方就可以了,而不用考慮其它的因素和可能影響到的地方。數據庫操作工具類如下:
public class DatabaseManager2 {

    private SQLiteOpenHelper mDatabaseHelper;
    private SQLiteDatabase db;

    public DatabaseManager2(SQLiteOpenHelper sqLiteOpenHelper){
        this.mDatabaseHelper = sqLiteOpenHelper;
    }

    /**
     for example
     ContentValues values = new ContentValues();
     values1.put("name", "張龍");
     values1.put("address", "beijing");
     values1.put("sex", "male");
     insert("user", values);

     * @param table
     * @param values
     * @return
     */
    public boolean insert(String table, ContentValues values){
        db = mDatabaseHelper.getWritableDatabase();
        boolean flag = false;
        long id = -1;
        try{
            id = db.insert(table, null, values);
            flag = id != -1;
        }catch (Exception e){
            e.printStackTrace();
        }
        close();
        return flag;
    }

    /**
     for example
     delete("user", " id =? ", new String[]{"1"});

     * @param table
     * @param whereClause
     * @param whereArgs
     * @return
     */
    public boolean delete(String table, String whereClause, String[] whereArgs){
        db = mDatabaseHelper.getWritableDatabase();
        boolean flag = false;
        int count;
        try {
            count = db.delete(table, whereClause, whereArgs);
            flag = count > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        close();
        return flag;
    }

    /**
     for example
     ContentValues values = new ContentValues();
     values.put("name", "張三");
     values.put("address", "上海");
     values.put("sex", "男");
     update("user", values, " id=? ", new String[]{"2"});

     * @param table
     * @param values
     * @param whereClause
     * @param whereArgs
     * @return
     */
    public boolean update(String table, ContentValues values, String whereClause,String[] whereArgs) {
        db = mDatabaseHelper.getWritableDatabase();
        boolean flag = false;
        int count;
        try {
            count = db.update(table, values, whereClause, whereArgs);
            flag = count > 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        close();
        return flag;
    }

    /**
     for example
     view("user", " id=? ", new String[]{"2"});

     * @param table
     * @param selection
     * @param selectionArgs
     * @return
     */
    public Map view(String table, String selection, String[] selectionArgs) {
        db = mDatabaseHelper.getReadableDatabase();
        Cursor cursor = null;
        Map map = new HashMap();
        try {
            cursor = db.query(true, table, null, selection,selectionArgs, null, null, null, null);
            int cols_len = cursor.getColumnCount();
            while (cursor.moveToNext()) {
                for (int i = 0; i < cols_len; i++) {
                    String cols_key = cursor.getColumnName(i);
                    String cols_value = cursor.getString(cursor.getColumnIndex(cols_key));
                    if (cols_value == null) {
                        cols_value = "";
                    }
                    map.put(cols_key, cols_value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(cursor != null){
            cursor.close();
        }
        close();
        return map;
    }

    /**
     for example
     listPersonMaps("user", null, null);

     * @param table
     * @param selection
     * @param selectionArgs
     * @return
     */
    public List> listPersonMaps(String table, String selection, String[] selectionArgs, String orderBy) {
        db = mDatabaseHelper.getReadableDatabase();
        List> list = new ArrayList>();
        Cursor cursor = null;
        try {
            cursor = db.query(false, table, null, selection,selectionArgs, null, null, orderBy, null);
            int cols_len = cursor.getColumnCount();
            while (cursor.moveToNext()) {
                Map map = new HashMap();
                for (int i = 0; i < cols_len; i++) {
                    String cols_key = cursor.getColumnName(i);
                    String cols_value = cursor.getString(cursor.getColumnIndex(cols_key));
                    if (cols_value == null) {
                        cols_value = "";
                    }
                    map.put(cols_key, cols_value);
                }
                list.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(cursor != null){
            cursor.close();
        }
        close();
        return list;
    }


    /**
     * 批量插入
     * @param sTableName
     * @param ListOfMaps
     */
    public void InsertMaps(String sTableName, List> ListOfMaps)
    {
        db = mDatabaseHelper.getWritableDatabase();
        try
        {
            boolean bFirst=true;
            if(ListOfMaps==null || ListOfMaps.size()<1)
            {
                return;
            }

            Log.e("insertbegin", "begin");
            db.beginTransaction();
            for(int i=0;ilistOfValues = new ArrayList
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved