自行封裝android數據庫操作工具類 DatabaseManger和DBHelper



自己封裝的,用了很久了,突然今天突然想起來把之前總結的一些東西傳上來,就一次性全傳上來了,都有註釋。

第一個工具類,DatabaseManger:

public class DatabaseManger<T> {

    private DBHelper dbHelper ;
    private  static  DatabaseManger instance =null;
    private SQLiteDatabase sqLiteDatabase;

    /**
     *
     * 構造方法上下文
     *
     * @param context
     * @return
     */
    private DatabaseManger(Context context)
    {
        dbHelper = new DBHelper(context);
        sqLiteDatabase = dbHelper.getWritableDatabase();
    }

    /**
     *
     * 獲取本類對象的實例
     * @param context
     * @return
     */
    public  static  final DatabaseManger getInstance(Context context)
    {
        if (instance == null)
        {
            if(context == null) {
                throw new RuntimeException("Context is null.");

            }
            instance = new DatabaseManger(context);
        }

        return instance;
    }

    /**
     * 關閉數據庫
     */
    public void close()
    {
        if(sqLiteDatabase.isOpen())
        {
            sqLiteDatabase.close();
            sqLiteDatabase=null;
        }
        if(dbHelper!=null)
        {
            dbHelper.close();
            dbHelper=null;
        }

        if(instance != null)
        {
            instance = null;
        }

    }

    /**
     * 執行一條sql語句
     *
     */

    public void execSql(String sql)
    {
        if(sqLiteDatabase.isOpen())
        {
            sqLiteDatabase.execSQL(sql);
        }
        else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
    }

    /**
     * sql執行查詢操作的sql語句
     * selectionargs查詢條件
     * 返回查詢的遊標,可對數據進行操作,但是需要自己關閉遊標
     */
    public Cursor queryData2Cursor(String sql,String[] selectionArgs)throws Exception
    {
        Cursor cursor = null;
        if(sqLiteDatabase.isOpen())
        {
            cursor = sqLiteDatabase.rawQuery(sql,selectionArgs);
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return cursor;
    }

    /**
     * 查詢表中數據總條數
     * 返回表中數據條數
     *
     */

    public int getDataCounts(String table)throws Exception
    {
        Cursor cursor = null;
        int counts = 0;
        if(sqLiteDatabase.isOpen())
        {
            cursor = queryData2Cursor("select * from "+ table,null);
            if(cursor != null && cursor.moveToFirst())
            {
                counts = cursor.getCount();
            }
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return counts;
    }

    /**
     *
     * 消除表中所有數據
     * @param table
     * @throws Exception
     */
    public void clearAllData(String table)throws Exception
    {
        if(sqLiteDatabase.isOpen())
        {
            execSql("delete from "+ table);
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
    }

    /**
     *
     * 插入數據
     * @param sql 執行操作的sql語句
     * @param bindArgs sql中的參數,參數的位置對於佔位符的順序
     * @return 返回插入對應的額ID,返回0,則插入無效
     * @throws Exception
     */

    public long insertDataBySql(String sql,String[] bindArgs)throws Exception
    {
        long id = 0;
        if(sqLiteDatabase.isOpen())
        {
            SQLiteStatement sqLiteStatement = sqLiteDatabase.compileStatement(sql);
            if(bindArgs != null)
            {
                int size = bindArgs.length;
                for (int i=0; i < size;i++)
                {
                    sqLiteStatement.bindString(i+1,bindArgs[i]);
                }
                id=sqLiteStatement.executeInsert();
                sqLiteStatement.close();
            }
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return id;
    }

    /**
     *
     * 插入數據
     * @param table 表名
     * @param values 數據
     * @return 返回插入的ID,返回0,則插入失敗
     * @throws Exception
     */
    public  long insetData(String table, ContentValues values)throws Exception
    {
        long id=0;
        if(sqLiteDatabase.isOpen())
        {
            id=sqLiteDatabase.insertOrThrow(table,null,values);
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return id;
    }

    /**
     *
     * 批量插入數據
     * @param table 表名
     * @param list 數據源
     * @param args 數據鍵名 key
     * @return
     * @throws Exception
     */
    public long insertBatchData(String table, List<Map<String,Object>> list,String[] args)throws Exception
    {
        long insertNum =0;
        sqLiteDatabase.beginTransaction();
        ContentValues contentValues = new ContentValues();
        for(int i=0; i <list.size();i++)
        {
            for(int j=0;j<args.length;j++)
            {
                contentValues.put(args[j],list.get(i).get(args[j]).toString());
            }
            long id = insetData(table,contentValues);
            if(id >0)
            {
                insertNum++;
            }
        }
        sqLiteDatabase.setTransactionSuccessful();
        sqLiteDatabase.endTransaction();
        return insertNum;
    }

    /**
     *
     * 更新數據
     * @param table 表名
     * @param values 需要更新的數據
     * @param whereClaause 表示sql語句中條件部分的語句
     * @param whereArgs 表示佔位符的值
     * @return
     * @throws Exception
     */
    public  int updateData(String table,ContentValues values,String whereClaause,String[] whereArgs)throws  Exception
    {
        int rowsNum = 0;
        if(sqLiteDatabase.isOpen())
        {
            rowsNum = sqLiteDatabase.update(table,values,whereClaause,whereArgs);
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return rowsNum;
    }

    /**
     *
     * 刪除數據
     * @param sql 待執行的sql語句
     * @param bindArgs sql語句中的參數,參數的順序對應占位符的順序
     */
    public void deleteDataBySql(String sql,String[] bindArgs)throws Exception
    {
        if(sqLiteDatabase.isOpen())
        {
            SQLiteStatement statement = sqLiteDatabase.compileStatement(sql);
            if(bindArgs != null)
            {
                int size = bindArgs.length;
                for(int i= 0;i<size;i++)
                {
                    statement.bindString(i+1,bindArgs[i]);
                }
                statement.execute();
                statement.close();
            }
        }else {
            throw  new RuntimeException("The DataBase has already closed");
        }
    }

    /**
     *
     * 刪除數據
     * @param table 表名
     * @param whereClause sql中的條件語句部分
     * @param whereArgs 佔位符的值
     * @return
     */
    public long deleteData(String table,String whereClause,String[] whereArgs)throws Exception
    {
        long rowsNum =0;
        if(sqLiteDatabase.isOpen())
        {
            rowsNum=sqLiteDatabase.delete(table,whereClause,whereArgs);
        }else
        {
            throw  new RuntimeException("The DataBase has already closed");
        }
        return rowsNum;
    }

    /**
     *
     * @param table 表名
     * @param columns 查詢需要返回的列的字段
     * @param selection SQL語句中的條件語句
     * @param selectionArgs 佔位符的值
     * @param groupBy 表示分組,可以爲NULL
     * @param having SQL語句中的having,可以爲null
     * @param orderBy 表示結果排序,可以爲null
     * @return
     * @throws Exception
     */
    public Cursor queryData(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)throws Exception
    {
        return queryData(table,columns,selection,selectionArgs,groupBy,having,orderBy,null);
    }



    /**
     *
     * @param table 表名
     * @param columns 查詢需要返回的列的字段
     * @param selection SQL語句中的條件語句
     * @param selectionArgs 佔位符的值
     * @param groupBy 表示分組,可以爲NULL
     * @param having SQL語句中的having,可以爲null
     * @param orderBy 表示結果排序,可以爲null
     * @param limit 表示分頁
     * @return
     * @throws Exception
     */
    public Cursor queryData(String table,String[] columns,String selection,String[] selectionArgs,
                            String groupBy,String having,String orderBy,String limit)throws Exception
    {
        return queryData(false,table,columns,selection,selectionArgs,groupBy,having,orderBy,limit);
    }

    /**
     * @param distinct true if you want each row to be unique,false otherwise
     * @param table 表名
     * @param columns 查詢需要返回的列的字段
     * @param selection SQL語句中的條件語句
     * @param selectionArgs 佔位符的值
     * @param groupBy 表示分組,可以爲NULL
     * @param having SQL語句中的having,可以爲null
     * @param orderBy 表示結果排序,可以爲null
     * @param limit   表示分頁
     * @return
     * @throws Exception
     */
    public Cursor queryData(boolean distinct,String table,String[] columns,String selection,
                            String[] selectionArgs,String groupBy,
                            String having,String orderBy,String limit)throws Exception
    {
     return queryData(null,distinct,table,columns,selection,selectionArgs,groupBy,having,orderBy,limit);
    }


    /**
     * @param cursorFactory 遊標工廠
     * @param distinct true if you want each row to be unique,false otherwise
     * @param table 表名
     * @param columns 查詢需要返回的列的字段
     * @param selection SQL語句中的條件語句
     * @param selectionArgs 佔位符的值
     * @param groupBy 表示分組,可以爲NULL
     * @param having SQL語句中的having,可以爲null
     * @param orderBy 表示結果排序,可以爲null
     * @param limit   表示分頁
     * @return
     * @throws Exception
     */
    public Cursor queryData(SQLiteDatabase.CursorFactory cursorFactory,boolean distinct,String table,String[] columns,String selection,
                            String[] selectionArgs,String groupBy,
                            String having,String orderBy,String limit)throws Exception
    {
        Cursor cursor = null;
        if(sqLiteDatabase.isOpen()){
            cursor = sqLiteDatabase.queryWithFactory(cursorFactory, distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
        }else{
            throw new RuntimeException("The database has already closed!");
        }
        return cursor;
    }

    /**
     *
     * @param sql 執行查詢造作的SQL語句
     * @param selectionArgs 查詢條件
     * @param object JAVABEAN對象
     * @return 查詢結果
     */
        public List<Map<String,String >> query2List(String sql,String[] selectionArgs,Object object)throws Exception
        {
            List<Map<String,String>> list = new ArrayList<>();
            if(sqLiteDatabase.isOpen())
            {
                Cursor cursor = null;
                cursor = queryData2Cursor(sql,selectionArgs);
                Field[] fields;
                HashMap<String,String> map;
                if(cursor !=null && cursor.getCount()>0)
                {
                    while (cursor.moveToNext())
                    {
                        map = new HashMap<>();
                        fields = object.getClass().getDeclaredFields();
                        for(int i =0; i< fields.length;i++)
                        {
                            /**
                             * 1通過key,即列名,得到所在的列索引
                             * 2通過所在行以及所在列的索引,得到唯一確定的隊友值
                             * 3將值與鍵封裝到MAP集合中,此條數據讀取完畢
                             */
                        map.put(fields[i].getName(),cursor.getString(cursor.getColumnIndex(fields[i].getName())));
                        }
                        list.add(map);
                    }
                    cursor.close();
                }
            }else
            {
                throw new RuntimeException("The database has already closed!");
            }
            return list;
        }
}




第二個工具類,DBHelpter


public class DBHelper extends SQLiteOpenHelper{

    //***數據庫名稱
    private static  final String DATABASE_NAME = "z_android_day14.db";
    //數據庫版本號
    private static final int DATABASE_VERSION=5;
    //創建表,用戶信息表
    public static final  String TABLE_USERINFO="user_info";
    //創建用戶信息表,建表語句
    public static final String TABLE_CITYINFO="city_info";
    public static final String TABLE_PROVINCEINFO="province_info";

    private static final String CREATE_USERINFO_SQL="CREATE TABLE "
            + TABLE_USERINFO
            + " (_id Integer primary key autoincrement,"
            + " uid integer,"
            + " nickname text,"
            + " avatar_url text,"
            + " username text,"
            + " account text,"
            + " password text);";

    private static final String TABEL_WEATHERINFO = "weather_info";

    private static final String CREATE_WEATHER_SQL="CREATE TABLE "
            + TABEL_WEATHERINFO
            + " (_id Integer primary key autoincrement,"
            + " cityid integer,"
            + " weather text,"
            + " degree text);";

    //城市信息表
    private static final String CREATE_CITY_SQL="CREATE TABLE "
            + TABLE_CITYINFO
            + " (_id Integer primary key autoincrement,"
            + " province_id text,"
            + " city_num text,"
            + " name text);";
    //省份信息表
    private static final String CREATE_PROVINCE_SQL="CREATE TABLE "
            + TABLE_PROVINCEINFO
            + " (_id Integer primary key autoincrement,"
            + " name text,"
            + " province_id text);";

    public DBHelper (Context context)
    {
        this(context,DATABASE_NAME,null,DATABASE_VERSION);

    }

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

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USERINFO_SQL);
        db.execSQL(CREATE_WEATHER_SQL);
        db.execSQL(CREATE_PROVINCE_SQL);
        db.execSQL(CREATE_CITY_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if(newVersion > oldVersion)
        {
            db.execSQL("DROP TABLE IF EXISTS "+ TABLE_USERINFO);
            db.execSQL("DROP TABLE IF EXISTS "+ TABEL_WEATHERINFO);
            db.execSQL("DROP TABLE IF EXISTS "+ TABLE_CITYINFO);
            db.execSQL("DROP TABLE IF EXISTS "+ TABLE_PROVINCEINFO);
            onCreate(db);

        }
    }
}



發佈了56 篇原創文章 · 獲贊 9 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章