自行封装android数据库操作工具类 DatabaseManger和DBHelper

来源:互联网 发布:php是什么货币 编辑:程序博客网 时间:2024/06/06 07:10



自己封装的,用了很久了,突然今天突然想起来把之前总结的一些东西传上来,就一次性全传上来了,都有注释。

第一个工具类,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);        }    }}



0 0
原创粉丝点击